Je viens de lire un article mentionnant "recherche de texte intégral" dans SQL.
Je me demandais juste quelle était la différence entre FTS et LIKE. J'ai lu quelques articles mais je n'ai rien trouvé qui l'explique bien.
la source
Je viens de lire un article mentionnant "recherche de texte intégral" dans SQL.
Je me demandais juste quelle était la différence entre FTS et LIKE. J'ai lu quelques articles mais je n'ai rien trouvé qui l'explique bien.
En général, il y a un compromis entre «précision» et «rappel». Une précision élevée 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 de 100% sans concession pour le rappel. Une fonction de recherche de texte intégral vous offre une grande 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 ensembles d'enregistrements, et fournit généralement un algorithme de classement pour quantifier dans quelle mesure 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 en tête qui nécessitent que chaque clé d'index soit examinée. En revanche, de nombreux systèmes de recherche d'informations peuvent permettre la prise en charge des principaux caractères génériques en précompilant les arborescences de suffixes dans les champs sélectionnés.
Les autres fonctionnalités typiques de la recherche en texte intégral sont
FTS implique l'indexation des mots individuels dans un champ de texte afin de rendre la recherche rapide dans de nombreux enregistrements. L'utilisation de LIKE vous oblige toujours à effectuer une recherche de chaîne (linéaire ou similaire) dans le champ.
la source
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.
Aussi, à partir de cette réponse SO :
la source
Like 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 similaires (SOUNDEX) et bien d'autres éléments.
Je commencerais à regarder le SQL CONTAINS () FREETEXT () et les éléments de recherche de texte intégral associés pour aider à mieux comprendre ce qui est disponible.
la source
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 - dont chacune est associée à un tableau de documents dans lesquels les clés (termes) apparaissent. C'est comme ça:
Maintenant, la matrice terme-document (quel terme membre de quel document) peut être représentée par:
Lorsque la demande arrive 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 peut contenir un paragraphe etc. L'index inversé contiendra les termes sous forme de clés de hachage et les ID de ligne comme les 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
Par exemple, ce SQL pourrait être déclenché pour extraire toutes les lignes correspondant au mot XYZ donné:
Attention: si vous ajoutez ORDER BY à cette requête, vos exécutions 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 parcourir linéairement la phrase / chaîne et de trouver tous les termes correspondants. L'ajout d'un joker ajoute au désordre. Cela fonctionne très bien pour les chaînes de petite longueur, comme vous pouvez l'imaginer, mais échouera lamentablement pour les phrases plus longues. Et certainement pas comparable avec un paragraphe ou une page entière de texte, etc.
la source
FTS est plus efficace, plus puissant (surtout pour les Word Breakers et les fonctionnalités de dérivation) ... mais vérifiez vos besoins car parfois les DB ne supportent pas toutes les langues par exemple MSSQL ne supporte pas le grec (vérifiez sur cette page http: // msdn. microsoft.com/en-us/library/ms176076(v=sql.110).aspx )
la source