2009-02-25 8 views
13

J'ai une table Products dans une base de données SQL Server et je dois dépanner une procédure stockée héritée qui utilise l'indexation de texte intégral. Pour notre propos ici, supposons que la table Produits a deux champs ID, Mots clés. Et le champ Mots-clés est rempli avec les éléments suivants:Problème SQL: L'utilisation de CONTAINS() ne fonctionne pas, mais LIKE fonctionne correctement

ROLAND SA-300 Ce Roland SA-300 est en état MINT!

Quand je lance la déclaration suivante, je suis en mesure de récupérer l'enregistrement:

SELECT * FROM Products WHERE Keywords LIKE '%SA-300%' 

Cependant, quand je lance l'un des énoncés suivants j'obtenir aucun résultat:

SELECT * FROM Products WHERE CONTAINS(Keywords, ' SA-300 ') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA-300') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"SA-300"') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*SA-300*"') 

Mais je sais que la fonction CONTAINS() fonctionne parce que j'obtiens des résultats quand je cours l'un de ceux-ci:

SELECT * FROM Products WHERE CONTAINS(Keywords, ' Roland ') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"Roland"') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*Roland*"') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland') 

Je dois comprendre pourquoi la fonction CONTAINS() ne fonctionne pas sur le terme 'SA-300'. Je suis nouveau pour les index en texte intégral, donc toute aide est appréciée.

+2

Aucun indice, mais avez-vous vérifié que l'index est à jour? – MichaelGG

Répondre

13

Deux pensées:

(1) Le trait d'union peut être traité comme un mot pause Qu'est-ce que ceux-ci reviennent?

SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA 300') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA300') 

Voir ceci other question.

(2) Avez-vous essayé de reconstruire votre index de texte intégral? Il est possible que ce soit périmé.

+0

# 2 était correct. Merci – jessegavin

-1

Pouvez-vous essayer

SELECT * FROM Products WHERE CONTAINS(Keywords, ' "SA-300" ') 

je vis un exemple de ce que vous essayez de le faire sur msdn.

+2

De sa question, il a essayé cela. – GregD

+0

Je ne savais pas si l'espace blanc importait. Je suppose que non. – ScArcher2

0

Avez-vous regardé votre fichier de mots de bruit? Sur mon ordinateur, il se trouve ici c: \ Program Files \ Microsoft \ SQL Server \ MSSQL.1 \ MSSQL \ FTData \ noiseFR.txt

Une façon de tester cela est d'éditer votre fichier de bruit en particulier avec un seul espace afin qu'il indexe tout et réessaye votre requête. Je "testerais" cela dans un environnement de test et non en production.

4

Il s'avère que j'avais besoin de re-construire mon index de texte intégral. Merci pour les conseils @MichaelGG et @JohnFx

1

Ah! Merci @GregD. Nous avons eu une recherche qui ne trouvait pas la chaîne "ça ne finit jamais" quand on cherchait "this *" ou "never *". Il s'avère les deux mots sont dans noiseENG.txt.

Il ne ressemble pas il est possible de désactiver cette fonction sur une base par requête, mais à partir de cette: SQL 2008: Turn off Stop Words for Full Text Search Query

J'ai couru

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF 

et nous avons commencé à obtenir les résultats que nous voulait.

Questions connexes