CONTAINSTABLE (Transact-SQL)

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

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

CONTAINSTABLE 对于与 CONTAINS 相同的匹配类型,并且使用与 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 ]
    )

参数

桌子

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

不能指定服务器名称,不能用于针对链接服务器的查询。

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) 将决定对其内容编制索引时使用哪种语言。 查询此类列时,请指定 LANGUAGE <language_term> 以增加良好匹配的概率。

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

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

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

top_n_by_rank

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

<contains_search_condition

指定要在 column_name 中搜索的文本和匹配条件 。 有关搜索条件的信息,请参阅 CONTAINS

注解

全文谓词和函数适用于单个表,该表在谓词中 FROM 隐含。 若要搜索多个表,请使用子句中的 FROM 联接表搜索结果集,该结果集是两个或多个表的乘积。

返回的表具有一个名为 KEY 包含全文键值的列。 每个全文索引表都有一个列,这些列的值保证是唯一的,列中 KEY 返回的值是与包含搜索条件中指定的选择条件匹配的行的全文键值。 TableFulltextKeyColumnOBJECTPROPERTYEX函数获取的属性提供此唯一键列的标识。 若要获取与全文索引的全文键关联的列的 ID,请使用 sys.fulltext_indexes 有关详细信息,请参阅 sys.fulltext_indexes

若要从原始表中获取所需的行,请指定与行的 CONTAINSTABLE 联接。 语句使用CONTAINSTABLE的典型形式FROMSELECT是:

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];

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

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

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

权限

执行权限仅可供对表或引用的表列具有适当 SELECT 权限的用户使用。

示例

答: 基本示例

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

CREATE TABLE Flags
(
    CountryOrRegion NVARCHAR (30) NOT NULL,
    FlagColors VARCHAR (200)
);

CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(CountryOrRegion);

INSERT INTO Flags VALUES ('France', 'Blue and White and Red');
INSERT INTO Flags VALUES ('Italy', 'Green and White and Red');
INSERT INTO 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. 返回排名值

以下示例搜索包含单词 framewheeltire和每个单词的不同权重的所有产品名称。 对于满足这些搜索条件的每个返回行,都将显示匹配的相关程度(排名值)。 此外,排名最高的行将首先返回。

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 在表中搜索 bracketreflector 彼此靠近 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 返回排名前五的结果

下面的示例返回前五个产品的说明,其中Description列包含单词附近的单词aluminumlight或单词lightweight

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

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 参数