2008-10-28 52 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”对任何记录进行排名