4

我们有一个返回这个的过程:

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]根据全文排名和 boost 列对结果进行全文搜索和排序。问题是,当我搜索 `ISABOUT("L*" WEIGHT(1.0))' 时,将给 '@Search' 作为 "L" 的输入,城市像

  • 拉各斯 拉各斯 尼日利亚
  • 秘鲁利马省利马省

显示高于Los Angeles California United States。虽然它们的提升较低,但全文搜索使它们具有更高的排名,因为它们重复相同的单词。这也发生在不重复单词但多次具有相同子词的地方的情况下。

如何禁用/解决此问题?

4

2 回答 2

2

SQL Server 使用的全文索引算法的权重非常大,以使文本匹配的更多出现次数获得更好的排名(在结果中将它们提高到更高的位置)。

来自MSDN

CONTAINSTABLE 排名使用以下算法

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

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

AFAIK 这个算法完全是内部的,不能修改。

作为一种解决方法,您可以更改索引器认为“单词”的内容,并让 SQL Server 的全文索引器忽略单词之间的空格 - 因此“L*”仅获得HitCount1 对“Lima Provincia de Lima Peru”而不是它现在获得的 2,从而将排名中的位置降低到您想要的位置。

如果您想尝试:查看或更改已注册的过滤器和分词器

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

于 2013-07-09T20:30:05.123 回答
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;

您不必rank仅仅因为使用CONSTAINSTABLE().

于 2013-07-09T20:36:49.687 回答