CONTAINSTABLE (Transact-SQL)

返回由包含以下各项的列组成的零行、一行或多行表:单个词或短语的完全匹配项或模糊匹配项、词在一定差别范围内的相近或加权匹配项。 CONTAINSTABLE 用在 Transact-SQL SELECT 语句的 FROM 子句中,被视为一个常规表名来引用。 它对包含基于字符的数据类型的全文索引列执行 SQL Server 全文搜索。

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

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

适用范围:SQL Server(SQL Server 2008 到当前版本)。

主题链接图标 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
    已进行了全文索引的表的名称。 table 可以是由一个部分、两个部分、三个部分或四个部分组成的数据库对象名称。 查询视图时,仅能涉及一个全文索引的基表。

    table 不能指定服务器名,也不能在针对链接服务器执行的查询中使用。

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

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

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

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

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

    如果指定为字符串,language_term 将对应于 sys.syslanguages 兼容性视图中的 alias 列值。 字符串必须用单引号引起来,如 '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 列中的返回值都是满足包含搜索条件中指定的选择条件的行的全文键值。 从 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.返回排名值

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

USE AdventureWorks2012;
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

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

适用于:SQL Server 2012 到 SQL Server 2014。

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

USE AdventureWorks2012
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。

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

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

USE AdventureWorks2012;
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

D.指定 LANGUAGE 参数

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

USE AdventureWorks2012;
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 参数不是必需的。

请参阅

任务

创建全文搜索查询 (Visual Database Tools)

参考

CONTAINS (Transact-SQL)

SELECT (Transact-SQL)

FROM (Transact-SQL)

概念

使用 RANK 限制搜索结果

使用全文搜索查询

使用全文搜索查询