Je suis nouveau à la search de text libre, alors pardonnez la question de débutant. Supposons que j'ai l'index de text intégral suivant:
Create FullText Index on Contacts( FirstName, LastName, Organization ) Key Index PK_Contacts_ContactID Go
Je veux faire une search en text libre pour les trois colonnes concaténées
FirstName + ' ' + LastName + ' ' + Organization
Alors que par exemple
jim smith
returnne tous les contacts nommés Jim Smith smith ibm
renvoie tous les contacts nommés Smith qui travaillent chez IBM Cela semble être un scénario assez commun. Je m'attendrais à ce que cela fonctionne:
Select c.FirstName, c.LastName, c.Organization, ft.Rank from FreeTextTable(Contacts, *, 'smith ibm') ft Left Join Contacts c on ft.[Key]=c.ContactID Order by ft.Rank Desc
mais c'est apparemment en train de faire smith OR ibm
; il renvoie beaucoup de Smiths qui ne travaillent pas chez IBM et vice versa. De manière surprenante, la search de smith AND ibm
donne des résultats identiques.
Cela fait ce que je veux …
Select c.FirstName, c.LastName, c.Organization from Contacts c where Contains(*, 'smith') and Contains(*, 'ibm')
… mais alors je ne peux pas paramétrer les requêtes provenant de l'user – je devrais décomposer la string de search en mots moi-même et assembler le SQL à la volée, ce qui est moche et dangereux.
L'approche habituelle que je prends est de créer une vue de search ou une colonne calculée (en utilisant un triggersur) qui met toutes ces valeurs dans un seul champ.
L'autre chose que je fais est d'utiliser un moteur de search en text intégral, tel que Lucene / Solr.
Les opérateurs booleans sont uniquement pris en charge pour CONTAINS, pas FREETEXT.
Essayez votre requête AND avec CONTAINSTABLE.