适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
返回包含精确或模糊(不太精确)匹配的列的零、一行或多行的表,与单个字词和短语匹配、彼此距离内字词的邻近度或加权匹配项。
CONTAINSTABLE在 Transact-SQL SELECT 语句的 FROM 子句中使用,并且被引用为正则表名。 它对包含基于字符的数据类型的全文索引列执行 SQL Server 全文搜索。
CONTAINSTABLE 对于与 CONTAINS 相同的匹配类型,并且使用与 CONTAINS 相同的搜索条件 CONTAINS非常有用。
但是,与使用查询不同的 CONTAINS是,对于每一行,使用 CONTAINSTABLE 相关性排名值 (RANK) 和全文键 (KEY)。 有关 SQL Server 支持的全文搜索形式的信息,请参阅使用全文搜索查询。
语法
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 返回的值是与包含搜索条件中指定的选择条件匹配的行的全文键值。
TableFulltextKeyColumn从OBJECTPROPERTYEX函数获取的属性提供此唯一键列的标识。 若要获取与全文索引的全文键关联的列的 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. 返回排名值
以下示例搜索包含单词 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 返回排名前五的结果
下面的示例返回前五个产品的说明,其中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 参数 。