我们有一个程序可以返回:
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”的输入,像
显示高于Los Angeles California United States
。虽然他们的提升较低,但全文搜索给他们提供了更高的排名,因为他们重复相同的单词。如果地方不重复单词但多次使用相同的子单词,也会发生这种情况。
如何禁用/解决此问题?
答案 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;
您不必仅仅因为使用rank
而CONSTAINSTABLE()
订购。