Recherche en texte intégral vs AIME
Ma question est à propos de l'utilisation fulltext.Comme je sais comme les requêtes qui commencent par % ne jamais utiliser d'index :
SELECT * from customer where name like %username%
Si j'utilise fulltext pour cette requête peut ı prendre de meilleures performances? SQL Server peut utiliser d'index de texte intégral avantages pour les requêtes comme %username%?
OriginalL'auteur profvm | 2010-11-16
Vous devez vous connecter pour publier un commentaire.
Réponse courte
Il n'existe pas de moyen efficace pour effectuer infix recherches dans SQL Server, ni à l'aide de
LIKE
sur une colonne indexée, ou avec un index de texte intégral.Réponse longue
Dans le cas général, il n'est pas fulltext équivalent à l'opérateur LIKE. Tout fonctionne COMME sur une chaîne de caractères et peut effectuer arbitraire générique matchs contre quoi que ce soit à l'intérieur de la cible, de par sa conception fulltext opère sur l'ensemble des mots/termes seulement. (C'est une légère simplification, mais il va faire pour le but de cette réponse.)
Texte intégral SQL Server prend en charge un sous-ensemble de COMME avec le terme de préfixe de l'opérateur. À partir de la documentation (http://msdn.microsoft.com/en-us/library/ms187787.aspx):
serait de retour des produits nommé à la tronçonneuse, cotte de mailles, etc. Fonctionnellement, ce n'est pas rien au-dessus de la norme
LIKE
opérateur (LIKE 'Chain%'
), et tant que la colonne est indexée, en utilisant un préfixe de recherche devrait donner des performances acceptables.L'opérateur LIKE permet de mettre le générique de n'importe où, par exemple
LIKE '%chain'
, et comme vous l'avez mentionné cela empêche un indice qui est utilisé. Mais avec fulltext, l'astérisque ne peut apparaître à la fin d'un terme de la requête, c'est donc d'aucune aide pour vous.L'aide, il est possible d'effectuer efficace postfix la recherche par la création d'une nouvelle colonne, fixant sa valeur à l'inverse de votre cible colonne, et l'indexation. Vous pouvez ensuite la requête comme suit:
qui retourne des produits avec leurs noms se terminant par "la chaîne".
Je suppose que vous pouvez ensuite combiner le préfixe et inversé postfix hack:
qui implémente un (potentiellement) indexés infix de recherche, mais il n'est pas particulièrement jolie (et je n'ai jamais testé afin de voir si l'optimiseur de requête serait à même d'utiliser les deux index dans son plan).
Est-ce toujours le cas avec SQL Server 2012 et 2014? =(
Vous dites dans le cas où vous aviez quelque chose comme: Select * from Personnes où FullName like '%jean% de "Il serait plus efficace de faire quelque chose de plus comme ceci: Select * from Personnes where FirstName comme "jean% de" ou Nom comme "jean% de" cela Fait-il sens?
Potentiellement oui, si les noms et prénoms sont indexés. Les requêtes ne sont pas exactement équivalents, cependant, que la deuxième requête ne serait pas trouver quelqu'un avec le nom de famille Littlejohn.
OriginalL'auteur Mike Chamberlain
Vous devez comprendre comment l'indice de travail. L'indice est le même comme les morts-bois de l'édition de l'encyclopédie.
Si vous utilisez:
L'index, en texte intégral ou pas fulltext devrait fonctionner. mais
ne fonctionnera jamais avec l'index. et il sera temps de requête.
developer.com/db/article.php/3446891 COMME est totalement différent de celui fulltext recherches. Seulement un simple indice sur un char/varchar attribut de travail dans votre première requête. Pas d'index de texte intégral est utilisé dans ce cas.
OriginalL'auteur Ran Bar-Zik
De ce que je connais fulltext index, je vais faire la suite des extrapolations:
En supposant que tout ce qui est correct, je vais aller de l'avant et de faire la déclaration suivante: L'index de texte intégral est en fait un index, ce qui rend la recherche plus rapide. Il est grand, et moins de recherche d'opportunités que COMME aurait, mais c'est beaucoup plus rapide.
Plus d'infos:
http://www.developer.com/db/article.php/3446891
http://en.wikipedia.org/wiki/Full_text_search
OriginalL'auteur AlexanderMP
Comme et contient sont très différents -
Prendre les valeurs de données suivantes
"john smith"
"sam smith"
'john fuller'
like '%'
"sam smith"
like '%s%'
"john smith"
"sam smith"
contient 's'
contient 'jean'
"john smith"
'john fuller'
contient 's*'
"john smith"
"sam smith"
contient s renvoie la même chose que contient s* - la première astérisque est ignoré, ce qui est un peu une douleur, mais ensuite, l'indice est de mots - pas de caractères
OriginalL'auteur Ed Green
https://stackoverflow.com/users/289319/mike-chamberlain, vous êtes tout à fait raison, comme vous le suggérez, il ne suffit pas à la recherche de quelque chose de " de la chaîne d'' WHERE Nom LIKE 'de la chaîne d'%'
ET Name_Reversed COMME 'niahc%' n'est pas équivalent à comme'%chaîne de%'****
OriginalL'auteur Michel