Полнотекстовый поиск по объединенным столбцам? - PullRequest
5 голосов
/ 30 ноября 2009

Я новичок в свободном текстовом поиске, так что извините за вопрос новичка. Предположим, у меня есть следующий полнотекстовый индекс:

Create FullText Index on Contacts(
    FirstName,
    LastName,
    Organization
)
Key Index PK_Contacts_ContactID
Go

Я хочу выполнить поиск в свободном тексте по всем объединенным столбцам

FirstName + ' ' + LastName + ' ' + Organization

Так что например

  • Поиск jim smith возвращает все контакты с именем Джим Смит
  • Поиск smith ibm возвращает все контакты по имени Смит, которые работают в IBM

Похоже, это будет довольно распространенный сценарий. Я ожидал, что это сработает:

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

но это, очевидно, делает smith OR ibm; он возвращает много кузнецов, которые не работают в IBM, и наоборот. Удивительно, но поиск smith AND ibm дает идентичные результаты.

Это делает то, что я хочу ...

Select c.FirstName, c.LastName, c.Organization
from Contacts c 
where Contains(*, 'smith') and Contains(*, 'ibm')

... но тогда я не могу параметризовать запросы, поступающие от пользователя - мне придется разбить строку поиска на слова и собрать SQL на лету, что уродливо и небезопасно.

Ответы [ 2 ]

2 голосов
/ 30 ноября 2009

Обычный подход, который я использую, заключается в создании представления поиска или вычисляемого столбца (с использованием триггера), который помещает все эти значения в одно поле.

Другая вещь, которую я делаю, - это использование полнотекстового поискового движка, такого как Lucene / Solr.

0 голосов
/ 30 ноября 2009

Логические операторы поддерживаются только для CONTAINS, но не для FREETEXT.

Попробуйте свой запрос AND с помощью CONTAINSTABLE.

...