对排名的结果集进行限制(全文搜索)

CONTAINSTABLEFREETEXTTABLE 函数返回名为 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

本节内容