Question

Nous utilisons SQL Server 2005 dans un projet. Les utilisateurs du système ont la possibilité de rechercher certains objets en utilisant des "mots-clés". Nous mettons cela en œuvre en créant un catalogue de texte intégral pour les colonnes significatives de chaque tableau pouvant contenir ces "mots-clés", puis en utilisant CONTAINS pour rechercher les mots-clés que l'utilisateur a saisis dans le champ de recherche de cet index.

Ainsi, supposons par exemple que vous ayez l'objet Film et que vous souhaitiez permettre à l'utilisateur de rechercher des mots-clés dans le titre et le corps de l'article, puis nous indexerions les colonnes Title et Plot, puis quelque chose comme:

SELECT * FROM Movies WHERE CONTAINS(Title, keywords) OR CONTAINS(Plot, keywords)

(C'est en fait un peu plus avancé que ça, mais rien de terriblement complexe)

Certains utilisateurs ajoutent des chiffres à leur recherche. Par exemple, ils veulent trouver "Terminator 2". Le problème ici est que, pour autant que je sache, par défaut, SQL Server n’indexe pas les mots courts. Vous effectuez donc une recherche comme celle-ci:

SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator 2"')

est en fait équivalent à ceci:

SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator"') <-- notice the missing '2'

et nous obtenons une pléthore de résultats parasites.

Existe-t-il un moyen de forcer SQL Server à indexer de petits mots? De préférence, je préfère indexer uniquement les nombres tels que 1, 2, 21, etc. Je ne sais pas où définir les critères d’indexation, ni même s’il est possible d’être aussi précis que cela.

Eh bien, j’ai fait cela, enlevé les "mots-parasites". de la liste, et maintenant le comportement est un peu différent, mais toujours pas ce que vous attendez.

Une recherche ne portera pas sur "Terminator 2" (Je ne fais que inventer cela, mon employeur ne serait peut-être pas très heureux si je divulguais ce que nous faisons ... de toute façon, les termes sont un peu différents mais le principe reste le même), je ne reçois rien du tout. , mais je sais qu'il existe des objets contenant les deux mots.

Peut-être que je fais quelque chose de mal? J'ai supprimé tous les chiffres 1 à 9 de ma configuration de bruit pour ENG, ENU et NEU (neutre), régénéré les index et essayé la recherche.

Était-ce utile?

La solution

Ces "petits mots" sont considérés comme " mots parasites " par l'index de texte intégral. Vous pouvez personnaliser la liste des mots parasites. This article de blog fournit plus de détails. Vous devez repeupler votre index de texte intégral lorsque vous modifiez le fichier de mots parasites.

Autres conseils

Je connaissais le fichier de mots parasites, mais je ne vous ai pas expliqué pourquoi votre "Terminator 2". exemple, vous donne toujours des problèmes. Vous pouvez essayer de poser cette question sur le forum du moteur de base de données MSDN où les gens qui se spécialisent dans ce genre de choses sortent.

Vous pouvez combiner CONTAINS (ou CONTAINSTABLE) avec des conditions simples où::

SELECT * FROM Movies WHERE CONTAINS (Titre, '' 'Terminator 2' '' ') et un titre tel que'% Terminator 2% '

Tandis que CONTAINS trouve tout le Terminator, où éliminera le 'Terminator 1'.

Bien sûr, le moteur est suffisamment intelligent pour démarrer avec la condition CONTAINS et non la même.

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