Recherche de text intégral sur des colonnes concaténées?

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

  • La search de jim smith returnne tous les contacts nommés Jim Smith
  • La search de 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.