2009-11-30 4 views
4

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

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

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

FirstName + ' ' + LastName + ' ' + Organization 

Так что, к примеру

  • Ищете jim smith возвратов все контакты по имени Джим Смит
  • Поиск smith ibm возвращает все контакты по имени Смит, которые работают t 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

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

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

+1

Спасибо - я закончил с использованием рассчитанного подхода столбца/триггера, чтобы заполнить поле SearchText и проиндексировать его. –

0

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

Попробуйте ваш запрос с СООТВЕТСТВУЮЩИМ.

+0

Если я заменил FREETEXTTABLE на CONTAINSTABLE, он не возвращает никаких результатов. Я предполагаю, что это потому, что нет ни одного столбца, который содержит как «кузнец», так и «ibm» - «кузнец» находится в LastName, а «ibm» - в организации. –

Смежные вопросы