Question

Je viens de lire un message mentionnant "recherche en texte intégral". en SQL.

Je me demandais simplement quelle était la différence entre FTS et LIKE. J'ai lu quelques articles mais je n'ai rien trouvé qui puisse bien l'expliquer.

Était-ce utile?

La solution

En général, il existe un compromis entre "précision" et "précision". et "rappeler". Une haute précision signifie que moins de résultats non pertinents sont présentés (pas de faux positifs), alors qu'un rappel élevé signifie qu'il y a moins de résultats pertinents manquants (pas de faux négatifs). L'utilisation de l'opérateur LIKE vous donne une précision de 100% sans aucune concession pour rappel. Une fonction de recherche en texte intégral vous donne beaucoup de flexibilité pour affiner la précision pour un meilleur rappel.

La plupart des implémentations de recherche en texte intégral utilisent un "index inversé". Il s'agit d'un index dans lequel les clés sont des termes individuels et les valeurs associées sont des ensembles d'enregistrements contenant le terme. La recherche en texte intégral est optimisée pour calculer l'intersection, l'union, etc. de ces jeux d'enregistrements. Elle fournit généralement un algorithme de classement permettant de quantifier la pertinence avec laquelle un enregistrement donné correspond aux mots clés de la recherche.

L'opérateur SQL LIKE peut être extrêmement inefficace. Si vous l'appliquez à une colonne non indexée, une analyse complète sera utilisée pour trouver des correspondances (comme toute requête sur un champ non indexé). Si la colonne est indexée, la correspondance peut être effectuée avec des clés d'index, mais avec beaucoup moins d'efficacité que la plupart des recherches d'index. Dans le pire des cas, le modèle LIKE aura des caractères génériques de premier plan nécessitant l'examen de chaque clé d'index. En revanche, de nombreux systèmes de récupération d'informations peuvent permettre la prise en charge des caractères génériques en pré-compilant des arborescences de suffixes dans des champs sélectionnés.

Les autres fonctionnalités typiques de la recherche en texte intégral sont

.
  • analyse lexicale ou tokenisation & # 8212; briser un bloc de texte non structuré en des mots individuels, des phrases et jetons spéciaux
  • morphologique analyse ou création de & # 8212; variations réductrices d'un mot donné dans un terme d'index; par exemple, traiter "souris" et "souris", ou "électrification" et " électrique " comme le même mot
  • classement & # 8212; mesure de la similitude d'un enregistrement correspondant à la chaîne de requête

Autres conseils

FTS implique l'indexation des mots individuels dans un champ de texte afin de permettre une recherche rapide dans de nombreux enregistrements. Pour utiliser LIKE, vous devez toujours effectuer une recherche de chaîne (linéaire ou similaire) dans le champ.

MySQL crée un index à partir des mots de la colonne de recherche en texte intégral activée et effectue des recherches sur cet index. MySQL utilise un algorithme sophistiqué pour déterminer les lignes correspondant à la requête de recherche.

De même, à partir de cette réponse à la SO :

  

La recherche en texte intégral présente quelques avantages.

     

Indexation:

     

Quelque chose comme:

WHERE Foo LIKE '%Bar';
     

Impossible de tirer parti d'un index. Il doit examiner chaque ligne et voir s'il y a correspondance. Un index de texte intégral, cependant, peut. En fait, les index en texte intégral peuvent offrir beaucoup plus de flexibilité en termes d’ordre des mots correspondants, de leur proximité, etc.

     

Racine:

     

Une recherche en texte intégral peut contenir des mots. Si vous recherchez run, vous pouvez obtenir des résultats pour " ran " ou "en cours d'exécution". La plupart des moteurs de texte intégral ont des dictionnaires de tige dans diverses langues.

     

Résultats pondérés:

     

Un index de texte intégral peut englober plusieurs colonnes. Par exemple, vous pouvez rechercher "tarte aux pêches" et l'index peut inclure un titre, des mots-clés et un corps. Les résultats correspondant au titre peuvent être pondérés plus haut, plus pertinents, et triés pour apparaître en haut.

     

Inconvénients:

     

Un index de texte intégral peut potentiellement être énorme, bien plus grand qu'un index B-TREE standard. Pour cette raison, de nombreux fournisseurs hébergés qui offrent des instances de base de données désactivent cette fonctionnalité, ou au moins facturent des frais supplémentaires. Par exemple, la dernière fois que j'ai vérifié, Windows Azure ne prend pas en charge les requêtes en texte intégral.

     

La mise à jour des index en texte intégral peut également être plus lente. Si les données changent beaucoup, il peut y avoir un certain retard dans la mise à jour des index par rapport aux index standard.

Comme utilise uniquement des caractères génériques, et n'est pas si puissant.

Le texte intégral permet une recherche beaucoup plus complexe, y compris And, Or, Not, même des résultats de son similaires (SOUNDEX) et de nombreux autres éléments.

Je commencerais par consulter SQL CONTAINS () FREETEXT () et les éléments de recherche en texte intégral connexes pour mieux comprendre ce qui est disponible.

La vraie différence réside dans les méthodes de numérisation. Pour la recherche en texte intégral, les mots (termes) sont utilisés comme clés de hachage. Chacun de ces mots est associé à un tableau de documents dans lequel apparaissent les clés (termes). C'est comme ça:

Document sets = {d1, d2, d3, d4, ... dn}
Term sets = {t1, t2, t3, .. tn}

Maintenant, la matrice terme-document (quel terme membre de quel document) peut être représentée comme suit:

t1 -> {d1, d5, d9,.. dn}
t2 -> {d11, d50, d2,.. dn}
t3 -> {d23, d67, d34,.. dn}
:
tn -> {d90, d87, d57,.. dn}

Lorsque la demande intervient, demandez "Obtenez-moi tous les documents contenant le mot / terme t1". - le jeu de documents {d1, d5, d9, .. dn } est alors renvoyé.

Vous pouvez pirater un schéma de table dé-normalisé pour stocker des documents - chaque ligne de la table MySQL sera considérée comme un "document". et une colonne TEXT pourrait contenir un paragraphe, etc. L'index inversé contiendra les termes clés de hachage et les identifiants de ligne les identifiants de documents.

N'oubliez pas que cette requête SQL aura plus ou moins de performances O (1). La requête sera indépendante de

  1. Nombre de mots / termes dans la colonne TEXT
  2. Le nombre de lignes / documents correspondant aux critères
  3. La longueur des mots / termes

Par exemple, ce code SQL pourrait être déclenché pour extraire toutes les lignes correspondant au mot donné XYZ:

SELECT * 
FROM   my_table 
WHERE  MATCH (my_text_column) against ('XYZ' IN boolean mode) ;

Avertissement: si vous ajoutez ORDER BY à cette requête, vos temps d'exécution varieront en fonction de plusieurs paramètres, dont le nombre de lignes / documents correspondants. Alors méfiez-vous.

Le LIKE n'a cependant rien de tout cela. Il est obligé de balayer linéairement la phrase / chaîne et de trouver tous les termes correspondants. Ajouter un joker ajoute au désordre. Comme vous pouvez l'imaginer, cela fonctionne très bien pour les petites chaînes, mais échouera lamentablement pour les phrases plus longues. Et certainement pas comparable lorsque vous avez un paragraphe ou une page entière de texte, etc.

FTS est plus efficace et puissant (en particulier pour Word Breakers et les fonctionnalités dérivantes)  ... mais vérifiez vos besoins car parfois les bases de données ne prennent pas en charge toutes les langues, par exemple MSSQL ne prend pas en charge le grec (consultez cette page http://msdn.microsoft.com/en-us/library/ms176076 (v = sql.110) .aspx )

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top