SQL Server全文排名示例

时间:2010-09-22 23:51:53

标签: sql-server full-text-search

到目前为止,我没有从全文查询中获得有意义的结果,因此我决定举一个简单的例子来说明我要做的事情以及我期望的结果。

我已经为列[Car]和主键[CarID]启用了全文启用了以下测试表(tblCars)。

CarID Car
----- -----------------
9     BMW 330Ci 2009
14    AUDI A4 2010
16    AUDI A3 2.0T 2009

我想对“audi OR bmw”这两个词进行排名搜索,我期望在所有搜索结果中获得相同的排名。

SELECT tblCars.*, [RANK] AS Ranked FROM viewCarSearch 
    INNER JOIN 
    (SELECT [KEY] AS CarID, [RANK] AS Ranked FROM CONTAINSTABLE 
    (tblCars, Car, @SearchOr))
    tblSearch ON tblCars.CarID = tblSearch.CarID 

相反,我得到了这个:

CarID Car                Ranked
----- ------------------ -------
9     BMW 330Ci 2009     48
14    AUDI A4 2010       32
16    AUDI A3 2.0T 2009  32


事实上,无论我做什么组合OR,宝马总是排名高于或等于奥迪,即使它看起来完全不合逻辑。我已经尝试在我的搜索词中使用了一些AND,但它仍然给出了奇怪的结果,宝马总是表现出比预期更好的效果。

任何人都可以指出我出错的地方......我认为我的期望一定是错的,但我无法想象我会如何为一张大桌子取得好成绩。

1 个答案:

答案 0 :(得分:1)

显然,微软认为宝马是奥迪的优质汽车。 : - )

好的,说真的,计算返回的RANK有很多因素,这是1到1000之间的无单位数。全文主要使用Jaccard Index来计算排名。考虑的其他因素包括文件长度(其他因素相同,较短的文件排名高于较长的文件)以及文件中搜索词/短语的出现次数。

我最好的解释你的结果,我强调这只是一个有根据的猜测,是:

  • CarIDs 14和16非常相似 文字,前10个字符各不相同 只有两个字符(位置7的4对3,位置10的0对。),所以他们会 排在一起。事实上,它们在你的例子中是平等的。
  • CarID 9的文字短于CarID 16,所以它 将获得更高的排名。