有一个存储过程在两个表上使用 FREETEXTTABLE 两次,然后合并结果并返回前 50 个。
问题是,如果我对“布鲁斯特的女性”进行搜索,结果返回“前杜夫斯莫塔的忏悔”,排名为 A 143,第二个“布鲁斯特女性”排名为 102,来自表 B .
这是因为计数吗?(表 A 返回结果总数为 2399。表 B 返回结果总数为 3445。)
有一个存储过程在两个表上使用 FREETEXTTABLE 两次,然后合并结果并返回前 50 个。
问题是,如果我对“布鲁斯特的女性”进行搜索,结果返回“前杜夫斯莫塔的忏悔”,排名为 A 143,第二个“布鲁斯特女性”排名为 102,来自表 B .
这是因为计数吗?(表 A 返回结果总数为 2399。表 B 返回结果总数为 3445。)
简短的回答:
自由文本排名基于 OKAPI BM25 排名公式。对查询中的每个词进行排名,并对值求和。自由文本查询将通过屈折生成(原始查询词的词干形式)将单词添加到查询中;这些单词被视为单独的术语,与生成它们的单词没有特殊的权重或关系。从同义词库功能生成的同义词被视为单独的、同等权重的术语。
当然,可以在 Microsoft 的网站上找到更长、更复杂的答案。对于高等数学,请单击此处。
1) 噪声文件被限制为几个字符,这意味着“of”这个词现在被认为很重要。
2)这两个表的结果(计数)确实很重要,因为较小的表很可能会被赋予更好的权重值。这将使排名在较小的表中更高。
Josef 与 MSDN 的链接非常适合弄清楚它如何计算排名值。
USE AdventureWorks2012;
GO
SELECT FT_TBL.Description
,KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
INNER JOIN FREETEXTTABLE(Production.ProductDescription,
Description,
'high level of performance') AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
ORDER BY RANK DESC;
GO
使用此 INNER JOIN 方法按排序顺序获取相关结果。参考:Azure SQL FREETEXABLE