2008-11-25 114 views
6

在過去的幾個小時裏,我一直在討論SQL Server全文搜索的各種不同變體。不過,我仍然無法弄清楚排名如何運作。我遇到了一些讓我困惑的例子,他們的排名高於其他人。例如全文搜索排名(SQL Server)

我有一張表,5列+更多沒有索引。全部是nvarchar字段。

我運行此查詢

SET @SearchString = REPLACE(@Name, ' ', '*" OR "') --Splits words with an OR between 
SET @SearchString = '"'[email protected]+'*"' 
print @SearchString; 

SELECT ms.ID, ms.Lastname, ms.DateOfBirth, ms.Aka, ms.Key_TBL.RANK, ms.MiddleName, ms.Firstname 
FROM View_MemberSearch as ms 
INNER JOIN CONTAINSTABLE(View_MemberSearch, (ms.LastName, ms.Firstname, ms.MiddleName, ms.Aka, ms.DateOfBirth), @SearchString) AS KEY_TBL 
    ON ms.ID = KEY_TBL.[KEY] 
WHERE KEY_TBL.RANK > 0 
ORDER BY KEY_TBL.RANK DESC; 

因此(嗯..幾乎與我不同的名字重新輸入),如果我搜索1964年11月5日JOHN JACKSON我會得到「11/05/1964" 年OR 「約翰*」 或 「傑克遜*」這些結果:

ID -- First Name -- Middle Name -- Last Name -- AKA -- Date of Birth -- SQL Server RANK 
---------------------------------------------------------------------------------- 
1 | DAVE  | JOHN  | MATHIS  | NULL | 11/23/1965 | 192 
2 | MARK  | JACKSON  | GREEN  | NULL | 05/29/1998 | 192 
3 | JOHN  | NULL  | JACKSON | NULL | 11/05/1964 | 176 
4 | JOE  | NULL  | JACKSON | NULL | 10/04/1994 | 176 

所以最後我的問題。我沒有看到第1行和第2行是如何排在第3行之上的,以及爲什麼第3行的排名與第4行相同。第2行應該具有最高的排名,因爲搜索字符串與First name和Last Name匹配作爲出生日期。

如果我將OR更改爲AND我沒有得到任何結果。

回答

6

我發現AND和OR子句別跨欄應用。創建一個合併列的索引視圖,你會得到更好的結果。看看我過去的問題,你會發現適合你的場景的信息。

我也發現我最好不要追加'*'。我認爲它會出現更多的比賽,但它往往會返回更糟的結果(特別是對於長單詞)。作爲一箇中間地帶,你可能只會在*後加上更長的單詞。

你給出的例子絕對是奇怪的。

+0

如何合併列並準確使用?我有同樣的問題。 – zsharp 2009-12-11 06:01:00

1

如果您刪除DoB標準會發生什麼?

MS全文搜索確實是一個真正的黑盒子,很難理解和定製 你幾乎把它原樣,不像Lucene是偉大的定製

1

謝謝你們。

弗蘭克你是正確的,AND和OR不跨欄這是我一開始沒有注意到的東西。

爲了獲得最佳效果,我必須將所有5列合併到一個視圖中的1列中。然後搜索該列。這樣做給了我想要的確切結果,而無需任何額外費用。轉換後

我實際的搜索字符串,它結束了「字1 *」和「字2 *」

使用%符號仍然沒有做什麼的MSDN說,它應該做的。這意味着如果我搜索了單詞josh,並且當我搜索時它變成了「Josh%」,那麼找不到「Joshua」。然而,當「Josh *」很愚蠢時,約書亞就會被找到。