2008-10-28 50 views
7

我在SQL Server中使用全文搜索排名時遇到了一些問題。SQL Server用於全文索引的排名方法

假設用戶搜索兩個單詞「foo bar」。我們假設用戶打算進行OR搜索,因此我們將「foo或bar」傳遞給我們的CONTAINSTABLE呼叫。我們發現,包含「foo」10次但不包含「bar」的行將具有更高的排名,然後是具有「foo」和「bar」的行。 我們希望有兩個詞都是優先於只有一個詞多次的行的行。有關如何實現這一目標的任何建議?

我發現與RANKMETHOD修飾符有關的文檔,但似乎僅適用於SQL Enterprise搜索,並且在常規SQL Server 2005安裝中不可用。我們也可以切換到Lucene.Net,但我希望驗證它有更好的排名可用。我們也可能會進行多次搜索併合並搜索結果,但隨着搜索字數的增加,這似乎不可取。

回答

1

只是對此進行跟蹤..當與字符串「A或B」匹配時,包含字符串A和B的行的排名較低的原因是A與B的列不同。如果我在將這些列合併到一個列中的表格,「A或B」的排名更符合我的預期。

1

我做了倒排索引和餘弦排名(全文檢索系統的核心算法和數據結構)Here.

在純餘弦排名進行簡短的討論,FOO(1),杆(1)應比foo(10),bar(0)更靠近foo,bar所佔據的矢量。人們可以調整事後餘弦值,這基本上是Pagerank所做的。如果全文搜索在計算點積後計算餘弦排序而不是加權軸,則這將解釋foo的不成比例的重要性。

2

RANKMETHOD不適用於任何版本的SQL Server。如果您正在構建關鍵字以進入CONTAINSTABLE搜索,並且您知道哪些單詞更「重要」,則可以使用ISABOUT和WEIGHT對單詞進行排名。

例如,如果富比巴較高的排名,你可以做這樣的事情:

SELECT * FROM CONTAINSTABLE(YourFullTextTable,*,「ISABOUT( 「foo」 的重量(0.5), 「酒吧」 WEIGHT (0.3))')

2

嘗試重寫查詢 SELECT * FROM CONTAINSTABLE(YourFullTextTable,*,'「foo bar」或「foo」〜「bar」或「foo or bar」')。該查詢本質上必須在「bar」> foo或bar附近用精確的「foo bar」>「foo」對任何記錄進行排名