web-dev-qa-db-fra.com

Qu'est-ce que la recherche en texte intégral et LIKE

Je viens de lire un article mentionnant "recherche plein texte" en SQL.

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

120
Nathan W

En général, il existe un compromis entre "précision" et "rappel". Une haute précision signifie que moins de résultats non pertinents sont présentés (pas de faux positifs), tandis qu'un rappel élevé signifie qu'il manque moins de résultats pertinents (pas de faux négatifs). L'utilisation de l'opérateur LIKE vous donne une précision à 100% sans concession de 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 qui contiennent le terme. La recherche en texte intégral est optimisée pour calculer l'intersection, l'union, etc. de ces jeux d'enregistrements, et fournit généralement un algorithme de classement pour quantifier la force avec laquelle un enregistrement donné correspond aux mots-clés de 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 par rapport aux 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 principaux qui nécessitent que chaque clé d'index soit examinée. En revanche, de nombreux systèmes de récupération d'informations peuvent permettre la prise en charge des caractères génériques principaux en précompilant des arborescences de suffixes dans des champs sélectionnés.

Les autres caractéristiques typiques de la recherche en texte intégral sont

  • analyse lexicale ou tokenisation: décomposition d'un bloc de texte non structuré en mots, phrases et jetons spéciaux
  • analyse morphologique, ou stemming - regroupement des variations d'un mot donné en un terme d'index; par exemple, traiter "souris" et "souris", ou "électrification" et "électrique" comme le même mot
  • classement: mesure de la similitude d'un enregistrement correspondant avec la chaîne de requête
146
erickson

FTS implique l'indexation des mots individuels dans un champ de texte afin de rendre rapide la recherche dans de nombreux enregistrements. L'utilisation de LIKE vous oblige toujours à effectuer une recherche de chaîne (linéaire ou similaire) dans le champ.

37

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.

Aussi, à partir de this SO answer :

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

Indexation:

Quelque chose comme:

WHERE Foo LIKE '%Bar';

Impossible de profiter d'un index. Il doit regarder chaque ligne et voir si elle correspond. Un index de texte intégral, cependant, peut. En fait, les index fulltext peuvent offrir beaucoup plus de flexibilité en termes d'ordre de correspondance des mots, de rapprochement de ces mots, etc.

Tiges:

Une recherche plein texte peut contenir des mots. Si vous recherchez run, vous pouvez obtenir des résultats pour "ran" ou "running". La plupart des moteurs de texte intégral ont des dictionnaires de tige dans une variété de 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 qui correspondent au titre peuvent être pondérés plus haut, comme plus pertinents, et peuvent être triés pour s'afficher près du haut.

Inconvénients:

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

La mise à jour des index Fulltext peut également être plus lente. Si les données changent beaucoup, il peut y avoir des index de mise à jour de décalage par rapport aux index standard.

17
Vipin Jain

Like n'utilise que 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 sondage similaires (SOUNDEX) et bien d'autres éléments.

Je commencerais à regarder SQL CONTAINS () FREETEXT () et les éléments de recherche en texte intégral associés pour aider à mieux comprendre ce qui est disponible.

15
Mitchel Sellers

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

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

Maintenant, la matrice terme-document (quel membre du terme 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 vient en demandant "Obtenez-moi tous les documents contenant le mot/terme t1" - alors l'ensemble de documents {d1, d5, d9,.. dn} est retourné.

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 "document" et une colonne TEXT pourrait contenir un paragraphe, etc. L'index inversé contiendra les termes sous forme de clés de hachage et les ID de ligne comme identifiants du document.

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 SQL peut être déclenché pour extraire toutes les lignes correspondant au mot XYZ donné:

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 l'un est 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. L'ajout de caractères génériques ajoute au désordre. Cela fonctionne très bien pour les cordes de petite longueur, comme vous pouvez l'imaginer, 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.

10
Kingz

FTS est plus efficace, plus puissant (en particulier pour Word Breakers et les fonctionnalités de stemming) ... mais vérifiez vos exigences 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 (vérifiez sur cette page http: //msdn.Microsoft.com/en-us/library/ms176076(v=sql.110).aspx )

3
kamskyleo