如果多次找到word,则SQL ContainsTable排名更高。我怎么阻止这个?

时间:2013-07-09 19:27:13

标签: sql sql-server full-text-search

我们有一个程序可以返回:

SELECT TOP 15 SearchName, AlternateName, CountryName, StateProvince, Latitude, Longitude, Type, boost + k.Rank as Rank
FROM SearchLocations
    INNER JOIN CONTAINSTABLE([SearchLocations], [SearchName], @Search) AS k
    ON SearchLocations.Id = k.[Key]
ORDER BY Rank DESC

基本上,它是全文搜索[SearchLocations]并根据全文排名和提升列对结果进行排序。问题是,当我搜索`ISABOUT(“L *”WEIGHT(1.0))'时,这将是“@Search”作为“L”的输入,像

这样的城市
  • Lagos Lagos Nigeria
  • Lima Provincia de Lima Peru

显示高于Los Angeles California United States。虽然他们的提升较低,但全文搜索给他们提供了更高的排名,因为他们重复相同的单词。如果地方不重复单词但多次使用相同的子单词,也会发生这种情况。

如何禁用/解决此问题?

2 个答案:

答案 0 :(得分:2)

SQL Server使用的全文索引的算法非常重要,以便更多地出现文本匹配更好的排名(在结果中将它们提高)。

来自MSDN

  

CONTAINSTABLE排名使用以下算法

     

StatisticalWeight = Log2((2 + IndexedRowCount)/ KeyRowCount)

     

Rank = min(MaxQueryRank, HitCount * 16 * StatisticalWeight / MaxOccurrence)

AFAIK此算法完全是内部的,无法修改。

作为一种解决方法,您可能能够更改索引器认为“单词”的内容并获取SQL Server的全文索引器以忽略单词之间的空格 - 因此“L *”只能获得{{ 1}} 1对“利马Provincia de Lima秘鲁”而不是它现在得到的2,从而将排名的位置降低到你想要的位置。

如果您想尝试一下:View or Change Registered Filters and Word Breakers

但是,你将失去全文搜索的大部分价值,所以我不推荐这个

答案 1 :(得分:0)

也许您应该按boost列排序:

SELECT TOP 15 SearchName, AlternateName, CountryName, StateProvince, Latitude, Longitude, Type, boost + k.Rank as Rank
FROM SearchLocations
    INNER JOIN CONTAINSTABLE([SearchLocations], [SearchName], @Search) AS k
    ON SearchLocations.Id = k.[Key]
ORDER BY boost desc;

您不必仅仅因为使用rankCONSTAINSTABLE()订购。