2008-10-22 11 views

Répondre

119

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), alors qu'un rappel élevé signifie que moins de résultats pertinents sont manquants (pas de faux négatifs). L'utilisation de l'opérateur LIKE vous donne 100% de précision sans concessions pour le rappel. Une fonction de recherche en texte intégral vous donne beaucoup de flexibilité pour régler la précision pour un meilleur rappel.

La plupart des implémentations de recherche de texte intégral utilisent un "index inversé". C'est un index où 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 ensembles d'enregistrements, et fournit généralement un algorithme de classement pour quantifier à quel point 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 motif LIKE comportera 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 principaux en précompilant des arbres de suffixes dans des champs sélectionnés.

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

  • analyse lexicale ou tokens — briser un bloc de texte non structuré en mots individuels, des phrases, et jetons spéciaux
  • d'analyse morphologique , ou abaissement — des variations de regroupement d'un mot donné en un terme d'index; par exemple, le traitement de « souris » et « souris », ou « électrification » et « électrique » en tant que le même mot
  • classement — mesure de la similitude d'un enregistrement correspondant à la chaîne de requête
+1

le classement est mieux expliqué dans @ VipinJain [ réponse] (http://stackoverflow.com/a/35765302/212044) – ychaouche

32

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 nécessite toujours que vous fassiez une recherche de chaîne (linéaire ou similaire) dans le champ.

+2

Explication très concise, merci – Baconbeastnz

14

Tout comme les caractères génériques, et n'est pas très 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 beaucoup plus d'éléments.

Je commencerais à regarder le SQL CONTAINS() FREETEXT() et les éléments de recherche Full Text associés pour aider à mieux comprendre ce qui est disponible.

+4

'même des résultats de sondage similaires' got me! J'ai appris une nouvelle chose aujourd'hui, merci! :-) –

+1

Je recommande fortement à tout le monde de vérifier [SOUNDEX] (https://docs.microsoft.com/en-us/sql/t-sql/functions/soundex-transact-sql) – sotn

9

La vraie différence est la méthodologie de balayage. Pour la recherche en texte intégral, les mots (termes) sont utilisés comme clés de hachage - dont chacun est associé à un ensemble de documents clés (termes) apparaît dans son comme ceci:.

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

maintenant terme-documents matrice (quel membre à long terme dont le 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 est en demandant « Donnez-moi tous les documents contenant le mot/terme t1 » - alors le document mis {d1, d5, d9,.. dn} est retourné.

Vous pouvez pirater un schéma de table dé-normalisé pour stocker des documents - chaque ligne dans la table MySQL sera considérée comme "document" et une colonne TEXT pourrait contenir un paragraphe etc. L'index inversé contiendra les termes comme clés de hachage et les identifiants de ligne comme identifiants de 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 TEXTE
  2. Le nombre de lignes/documents correspondant aux critères
  3. La longueur des mots/termes

Pour par exemple ce SQL pourrait être tiré 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 ajouter ORDER BY à cette requête, vos temps d'exécution varient 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 obtenu de ceci. Il est forcé 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 petites cordes, comme vous pouvez l'imaginer, mais échouera misérablement pour des phrases plus longues. Et certainement pas comparable lorsque vous avez un paragraphe ou une page entière de texte, etc.

12

MySQL crée un index à partir des mots de la colonne de recherche de 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.

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

indexation:

Quelque chose comme:

OÙ Foo LIKE '% Bar'; Impossible de tirer parti d'un index. Il doit regarder chaque rangée, et voir si elle correspond. Un index de texte intégral, cependant, peut. En fait, les index en texte intégral peut offrir beaucoup plus de flexibilité en termes de l'ordre des mots, correspondant à la proximité de ces mots sont ensemble, etc.

Découlant:

Une recherche textuelle peut provenir des mots.Si vous recherchez run, vous pouvez obtenir des résultats pour "run" ou "running". La plupart des moteurs de texte intégral ont des dictionnaires de racine 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 "peach pie" 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 montrer près du sommet.

Inconvénients:

Un index texte intégral peut être potentiellement énormes, plusieurs fois plus grand qu'un index standard B-TREE. 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 des frais supplémentaires. Par exemple, la dernière fois que j'ai vérifié, Windows Azure ne prenait pas en charge les requêtes fulltext.

Les index de texte intégral peuvent également être mis à jour plus lentement. Si les données changent un lot , il peut y avoir des index de mise à jour différée par rapport aux index standard.

Questions connexes