首先,似乎沒有辦法使用全文搜索來獲得完全匹配。這似乎是一個高度討論的問題,當使用全文搜索方法,並有很多不同的解決方案來實現預期的結果,但大多數似乎非常低效。由於我的數據庫的容量,我不得不使用全文搜索,所以我最近必須實施其中的一種解決方案才能獲得更準確的結果。SQL Server全文搜索與回退的完全匹配
由於工作原理,我無法使用全文搜索的排名結果。例如,如果您搜索了名爲Toy Story
的電影,並且還有一個名爲The Story Behind Toy Story
的電影,它會出現而不是完全匹配,因爲它找到了Story
兩次字詞和Toy
。
我會跟蹤自己的排名,我稱之爲「人氣」,每次用戶訪問記錄時數量都會增加。我使用這個數據點來衡量我的結果,以幫助確定用戶可能在尋找什麼。
我也有問題,有時需要退回到LIKE搜索並且不返回完全匹配。即搜索Goonies
應該返回The Goonies
(最流行的結果)
因此,這裏是實現這個我目前的存儲過程的例子:
DECLARE @Title varchar(255)
SET @Title = '"Toy Story"'
--need to remove quotes from parameter for LIKE search
DECLARE @Title2 varchar(255)
SET @Title2 = REPLACE(@title, '"', '')
--get top 100 results using full-text search and sort them by popularity
SELECT TOP(100) id, title, popularity As Weight into #TempTable FROM movies WHERE CONTAINS(title, @Title) ORDER BY [Weight] DESC
--check if exact match can be found
IF EXISTS(select * from #TempTable where Title = @title2)
--return exact match
SELECT TOP(1) * from #TempTable where Title = @title2
ELSE
--no exact match found, try using like with wildcards
SELECT TOP(1) * from #TempTable where Title like '%' + @title2 + '%'
DROP TABLE #TEMPTABLE
此存儲過程執行分鐘約5000次,足夠它的瘋狂不要把我的服務器放到膝蓋上。但我真的想知道是否有更有效的方法呢?謝謝。
您能否解釋ORDER BY CASE部分,因爲它以某種方式工作,但它應該在某些情況下拋出一個「ORDER BY位置編號0超出了選擇列表中項目數量的範圍」,這讓我非常困惑。謝謝 – bfritz 2014-10-07 17:27:33
@bfritz ORDER BY表達式不會引用結果的索引。但結果按表達式值的順序列出。因此,對於標題完全匹配的行,第一個表達式('CASE WHEN m.title = @ title2 THEN 0 ELSE 1 END')的計算結果爲0.此行在所有其他標題不是其標題的行之前列出完全匹配。對於這些行,第一個表達式的計算結果爲1. – flup 2014-10-07 19:33:30
感謝您的迴應,我將試着優化我所有沉重的存儲過程(每天有超過2千5百萬個請求)如果你的內部連接方法將使用比我選擇的100更少的資源到2個選擇運行的#temp表中。然而,你的方法確實看起來更好看。 – bfritz 2014-10-07 19:49:01