CONTAINSTABLE (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

返回包含精确或模糊 (不太精确的) 与单个单词和短语匹配、相互一定距离内字词的邻近度或加权匹配项的列的零行、一行或多行的表。 CONTAINSTABLE 在 Transact-SQL SELECT 语句的 FROM 子句 中使用,并被引用为常规表名称。 它对包含基于字符的数据类型的全文索引列执行SQL Server全文搜索。

CONTAINSTABLE 适用于与 CONTAINS 谓词 相同的匹配类型,并且使用与 CONTAINS 相同的搜索条件。

但与 CONTAINS 不同,使用 CONTAINSTABLE 的查询对每一行返回一个相关性排名值 (RANK) 和全文键 (KEY)。 有关 SQL Server 支持的全文搜索形式的信息,请参阅使用全文搜索查询

Transact-SQL 语法约定

语法

  
CONTAINSTABLE   
( table , { column_name | ( column_list ) | * } , ' <contains_search_condition> '   
     [ , LANGUAGE language_term]   
  [ , top_n_by_rank ]   
)   
  
<contains_search_condition> ::=   
    { <simple_term>   
    | <prefix_term>   
    | <generation_term>   
    | <generic_proximity_term>   
    | <custom_proximity_term>   
    |  <weighted_term>   
    }   
    | { ( <contains_search_condition> )   
    { { AND | & } | { AND NOT | &! } | { OR | | } }   
     <contains_search_condition> [ ...n ]   
    }  
  
<simple_term> ::=   
     { word | "phrase" }  
<prefix term> ::=   
     { "word*" | "phrase*" }   
<generation_term> ::=   
     FORMSOF ( { INFLECTIONAL | THESAURUS } , <simple_term> [ ,...n ] )   
  
<generic_proximity_term> ::=   
     { <simple_term> | <prefix_term> } { { { NEAR | ~ }   
     { <simple_term> | <prefix_term> } } [ ...n ] }  
  
<custom_proximity_term> ::=   
  NEAR (   
     {  
        { <simple_term> | <prefix_term> } [ ,...n ]  
     |  
        ( { <simple_term> | <prefix_term> } [ ,...n ] )   
      [, <maximum_distance> [, <match_order> ] ]  
     }  
       )   
  
      <maximum_distance> ::= { integer | MAX }  
      <match_order> ::= { TRUE | FALSE }   
  
<weighted_term> ::=   
     ISABOUT  
    ( { {   
  <simple_term>   
  | <prefix_term>   
  | <generation_term>   
  | <proximity_term>   
  }   
   [ WEIGHT ( weight_value ) ]   
   } [ ,...n ]   
    )  
  

参数

table
已进行了全文索引的表的名称。 可以是一个、两个、三个或四个部分的数据库对象名称。 查询视图时,仅能涉及一个全文索引的基表。

不能指定服务器名称,并且不能在针对链接服务器的查询中使用。

column_name
是为进行全文搜索而编制了索引的一个或多个列的名称。 列可以是 char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary 或 varbinary(max) 类型 。

column_list
指示可以指定多个列(以逗号分隔)。 column_list 必须用括号括起来。 除非指定 language_term,否则 column_list 中所有列的语言必须相同 。

*
指定应使用 中的所有全文索引列来搜索给定的搜索条件。 除非指定 language_term,否则表的所有列的语言必须相同。

LANGUAGE language_term
其资源将用于断字、词干和同义词库以及干扰词 (或 非索引字) 作为查询的一部分删除的语言。 此参数是可选的,可以将其指定为与语言区域设置标识符 (LCID) 对应的字符串、整数或十六进制值。 如果指定了 language_term,则它表示的语言将应用于搜索条件的所有元素。 如果未指定值,则使用该列的全文语言。

如果将不同语言的文档一起作为二进制大型对象 (BLOB) 存储在单个列中,则指定文档的区域设置标识符 (LCID) 将决定对其内容编制索引时使用哪种语言。 在对这种列进行查询时,指定 LANGUAGElanguage_term 可增大找到有效匹配项的可能性

指定为字符串时,language_term对应于 sys.syslanguages 兼容性视图中的别名列值。 字符串必须用单引号引起来,如 'language_term'。 如果指定为整数,则 language_term 就是标识该语言的实际 LCID。 如果指定为十六进制值,则 language_term 将以 0x 开头,后跟 LCID 的十六进制值。 十六进制值不能超过八位(包括前导零在内)。

如果该值是双字节字符集 (DBCS) 格式,则 Microsoft SQL Server 会将其转换为 Unicode 格式。

如果指定的语言无效,或者未安装对应于该语言的资源,SQL Server 将返回错误。 若要使用非特定语言资源,请将 0x0 指定为 language_term 。

top_n_by_rank
指定仅返回按降序排列的 n 个最高匹配项。 仅当指定整数值 n 时适用。 如果 top_n_by_rank 与其他参数组合使用,则查询返回的行数可能会少于实际与所有谓词都匹配的行数。 top_n_by_rank 允许通过仅召回最相关的命中来提高查询性能。

<contains_search_condition>
指定要在 column_name 中搜索的文本和匹配条件 。 有关搜索条件的信息,请参阅 CONTAINS (Transact-SQL)

备注

全文谓词和函数作用于 FROM 谓词所示的单个表。 若要对多个表进行搜索,请在 FROM 子句中使用联接表,以搜索由两个或更多个表的乘积构成的结果集。

返回的表有一个名为 KEY 的列,其中包含全文键值。 每个全文索引表都有一个列,其值保证是唯一的, 在 KEY 列中返回的值是与 contains search 条件中指定的选择条件匹配的行的全文键值。 从 OBJECTPROPERTYEX 函数获取的 TableFulltextKeyColumn 属性提供此唯一键列的标识。 若要获取与全文索引的全文键关联的列的 ID,请使用 sys.fulltext_indexes。 有关详细信息,请参阅 sys.fulltext_indexes (Transact-SQL)

若要从原始表中获得所需要的行,请指定与 CONTAINSTABLE 行的联接。 使用 CONTAINSTABLE 的 SELECT 语句的 FROM 子句的典型形式为:

SELECT select_list  
FROM table AS FT_TBL INNER JOIN  
   CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL  
   ON FT_TBL.unique_key_column = KEY_TBL.[KEY];  

CONTAINSTABLE 生成的表包含名为 RANK 的列。 RANK 列是每行 (0 到 1000) 的值,指示行与选择条件的匹配程度。 在 SELECT 语句中,此排名值通常按照下列方法之一使用:

  • 在 ORDER BY 子句中返回排名最高的行作为表的第一行。

  • 在选择列表中查看分配给每一行的排名值。

权限

只有对表或被引用表的列具有适当 SELECT 权限的用户才具有执行权限。

示例

A. 简单示例

以下示例创建并填充一个包含两列的简单表,其中列出了 3 个县及其标志中的颜色。 它创建并填充表上的全文目录和索引。 然后演示 CONTAINSTABLE 语法。 此示例演示多次满足搜索值时排名值如何增大。 在最后一个查询中,同时包含绿色和黑色的坦桑尼亚的排名高于仅包含一种查询颜色的意大利。

CREATE TABLE Flags (Country nvarchar(30) NOT NULL, FlagColors varchar(200));  
CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(Country);  
INSERT Flags VALUES ('France', 'Blue and White and Red');  
INSERT Flags VALUES ('Italy', 'Green and White and Red');  
INSERT Flags VALUES ('Tanzania', 'Green and Yellow and Black and Yellow and Blue');  
SELECT * FROM Flags;  
GO  
  
CREATE FULLTEXT CATALOG TestFTCat;  
CREATE FULLTEXT INDEX ON Flags(FlagColors) KEY INDEX FlagKey ON TestFTCat;  
GO   
  
SELECT * FROM Flags;  
SELECT * FROM CONTAINSTABLE (Flags, FlagColors, 'Green') ORDER BY RANK DESC;  
SELECT * FROM CONTAINSTABLE (Flags, FlagColors, 'Green or Black') ORDER BY RANK DESC;  

B. 返回排名值

下面的示例搜索包含词“frame”、“wheel”或“tire”的所有产品名称,并为每个词指定了不同的权重。 对于满足这些搜索条件的每个返回行,都将显示匹配的相关程度(排名值)。 此外,排名最高的行将首先返回。

USE AdventureWorks2022;  
GO  
  
SELECT FT_TBL.Name, KEY_TBL.RANK  
    FROM Production.Product AS FT_TBL   
        INNER JOIN CONTAINSTABLE(Production.Product, Name,   
        'ISABOUT (frame WEIGHT (.8),   
        wheel WEIGHT (.4), tire WEIGHT (.2) )' ) AS KEY_TBL  
            ON FT_TBL.ProductID = KEY_TBL.[KEY]  
ORDER BY KEY_TBL.RANK DESC;  
GO  

C. 返回大于指定值的排名值

适用于:SQL Server 2012 (11.x) 及更高版本。

下面的示例使用 NEAR 搜索 bracket 表中彼此相近的“reflector”和“Production.Document”。 仅返回排名值为 50 或排名值更高的行。

USE AdventureWorks2022  
GO  
  
SELECT DocumentNode, Title, DocumentSummary  
FROM Production.Document AS DocTable   
INNER JOIN CONTAINSTABLE(Production.Document, Document,  
  'NEAR(bracket, reflector)' ) AS KEY_TBL  
  ON DocTable.DocumentNode = KEY_TBL.[KEY]  
WHERE KEY_TBL.RANK > 50  
ORDER BY KEY_TBL.RANK DESC;  
GO  

注意

如果全文查询没有指定一个整数作为最大距离,则只包含相隔距离大于 100 个逻辑词的匹配项的文档将不满足 NEAR 要求,其排名将为 0。

D. 使用 top_n_by_rank 返回排名前 5 位的结果

下面的示例返回前 5 个产品的说明,其中 Description 列在单词“light”或“lightweight”附近包含字词“aluminum”。

USE AdventureWorks2022;  
GO  
  
SELECT FT_TBL.ProductDescriptionID,  
   FT_TBL.Description,   
   KEY_TBL.RANK  
FROM Production.ProductDescription AS FT_TBL INNER JOIN  
   CONTAINSTABLE (Production.ProductDescription,  
      Description,   
      '(light NEAR aluminum) OR  
      (lightweight NEAR aluminum)',  
      5  
   ) AS KEY_TBL  
   ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];  
GO  

GO

E. 指定 LANGUAGE 参数

以下示例说明了如何使用 LANGUAGE 参数。

USE AdventureWorks2022;  
GO  
  
SELECT FT_TBL.ProductDescriptionID,  
   FT_TBL.Description,   
   KEY_TBL.RANK  
FROM Production.ProductDescription AS FT_TBL INNER JOIN  
   CONTAINSTABLE (Production.ProductDescription,  
      Description,   
      '(light NEAR aluminum) OR  
      (lightweight NEAR aluminum)',  
      LANGUAGE N'English',  
      5  
   ) AS KEY_TBL  
   ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];  
GO  

注意

使用 top_n_by_rank 不需要 LANGUAGE language_term 参数。

另请参阅

使用 RANK 限制搜索结果
使用全文搜索查询
创建全文搜索查询 (Visual Database Tools)
CONTAINS (Transact-SQL)
使用全文搜索查询
SELECT (Transact-SQL)
FROM (Transact-SQL)