2011-07-08 112 views
0

我有一個表(目錄)與一列(標題)。此欄存儲有關歌曲(藝術家,標題,混音)的信息。我有一種情況,我需要從搜索詞中找到匹配項。SQL Server全文搜索困境

我啓用了SQL Server FTS並使用Title列創建了FTS目錄。我在搜索詞中通過了使用FREETEXTTABLE的測試。

我發現這將返回許多不相關的結果,儘管如果標題存在於Catalog表中,排名靠前的結果通常是正確的。我的一種方法是將RANK轉換爲百分比,並只顯示百分比大於90的結果。問題是,如果標題在目錄表中不存在,則查詢仍會返回不相關的結果。

另一種方法是使用CONTAINSTABLE。這裏的問題是,我將不得不動態生成的代碼查詢(打破的話)創建類似:

SELECT DISTINCT ft.[rank], [Id] 
FROM CONTAINSTABLE(Catalogs, Title, '"artist" AND "title" AND "remix"') AS ft 
JOIN [Catalogs] ON [Catalogs].[Id] = ft.[KEY] 

的困境是,有在搜索項的分隔符。這意味着我無法在邏輯上將字符串分解爲藝術家和標題,而只是單詞。有時會包含其他條款,例如會導致上述查詢失敗的標籤。

我有點卡住了。有沒有人處理過使用SQL Server FTS的類似問題? CONTAINSTABLE和FREETEXTTABLE之間是否有一種方法?

回答

3

我們遇到了一個類似的問題,允許用戶輸入免費的查詢搜索字符串,但由於FREETEXT返回的錯誤肯定太多,我們不得不使用CONTAINS。我們最終在業務層上編寫了我們自己的搜索項分析例程,該例程用於擦洗字符串並用AND替換任何空格。這當然必須足夠聰明,以適應邏輯分組(當人們使用括號時)和多個空格。它似乎對我們很好。

我對你列中的數據結構有點好奇。如果藝術家,標題和混音是真正獨立的信息位,將它們作爲不同的列維護並分別進行查詢是沒有意義的。