2009-11-30 118 views
4

我是新來的自由文本搜索,所以請原諒這個新手問題。假設我有以下的全文索引:跨連續列的全文搜索?

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

我想這樣做對級聯

FirstName + ' ' + LastName + ' ' + Organization 

所有三列的自由文本搜索,這樣例如

  • 搜索jim smith回報所有名爲Jim Smith的聯繫人
  • 搜索smith ibm返回所有名爲Smith的聯繫人,他們工作在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工作的Smiths,反之亦然。令人驚訝的是,搜索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字段,並索引。 – 2009-12-19 12:36:40

0

布爾運算符只支持CONTAINS,而不支持FREETEXT。

嘗試使用CONTAINSTABLE進行AND查詢。

+0

如果我用CONTAINSTABLE替換FREETEXTTABLE,它將不返回任何結果。我認爲這是因爲沒有一列包含「smith」和「ibm」 - 「smith」在LastName中,而「ibm」在Organization中。 – 2009-11-30 22:08:20