对排名的结果集进行限制(全文搜索)
CONTAINSTABLE 和 FREETEXTTABLE 函数返回名为 RANK 的列,该列包含从 0 到 1000 的序数值(排名值)。这些值用来根据返回的行与选择条件的匹配程度对这些行进行排名。排名值仅表示结果集中各行相关性的相对顺序,值越小,表示相关性越低。实际的值并不重要,并且每次运行查询时实际值通常都不同。
注意 |
---|
CONTAINS 和 FREETEXT 谓词不会返回任何排名值。 |
符合搜索条件的项通常有很多。为防止 CONTAINSTABLE 或 FREETEXTTABLE 查询返回太多匹配项,请使用可选的 top_n_by_rank 参数,此参数仅返回行的子集。top_n_by_rank 是整数值 n,它指定仅返回 n 个排名值最高的匹配项,并按降序排列。如果 top_n_by_rank 与其他参数组合使用,则查询返回的行数可能会少于实际与所有谓词都匹配的行数。
SQL Server 按排名对匹配项进行排序,并且最多只返回指定数目的行。这样可以大幅度提高性能。例如,对于正常情况下会从一个包含一百万行的表中返回 100,000 行的查询,如果只要求返回前 100 行,此查询的处理速度会更快。
注意 |
---|
有关全文搜索如何生成排名值的信息,请参阅搜索查询结果如何进行排名(全文搜索)。 |
示例
示例 A:仅搜索前三个匹配项
下面的示例使用 CONTAINSTABLE 仅返回前三个匹配项。
USE Northwind;
GO
SELECT K.RANK, CompanyName, ContactName, Address
FROM Customers AS C
INNER JOIN
CONTAINSTABLE(Customers,Address, 'ISABOUT ("des*",
Rue WEIGHT(0.5),
Bouchers WEIGHT(0.9))', 3) AS K
ON C.CustomerID = K.[KEY];
GO
下面是结果集。
RANK CompanyName ContactName address
---- ------------ ----------- -------
123 Bon app' Laurence Lebihan 12, rue des Bouchers
65 Du monde entier Janine Labrune 67, rue des Cinquante Otages
15 France restauration Carine Schmitt 54, rue Royale
示例 B:搜索前十个匹配项
下面的示例使用 CONTAINSTABLE 返回前 10 个食品类别的说明和类别名称,其中 Description 列包含接近单词“sauces”或“candies”的“sweet and savory”。
SELECT FT_TBL.Description,
FT_TBL.CategoryName,
KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
CONTAINSTABLE (Categories, Description,
'("sweet and savory" NEAR sauces) OR
("sweet and savory" NEAR candies)'
, 10
) AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY];
GO
本部分内容
- 搜索查询结果如何进行排名(全文搜索)
介绍全文搜索如何生成查询返回的排名值,包括计算排名时常用的重要术语和统计值,以及 CONTAINSTABLE 和 FREETEXTTABLE 函数结果的排名。