FREETEXTTABLE (Transact-SQL)
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例
Transact-SQL SELECT 语句的 FROM 子句 中使用的函数,用于对包含基于字符的数据类型的全文索引列执行 SQL Server 全文搜索。 此函数返回一个表,其中包含与指定 freetext_string中文本的含义(而不仅仅是确切措辞)匹配的值的列的零行、一行或多行。 FREETEXTTABLE 被视为一个常规表名来引用。
FREETEXTTABLE 适用于与 FREETEXT(Transact-SQL)相同的匹配类型,
使用 FREETEXTTABLE 的查询返回每一行的相关性排名值 (RANK) 和全文键 (KEY)。
注意
有关 SQL Server 支持的全文搜索形式的信息,请参阅使用全文搜索查询。
语法
FREETEXTTABLE (table , { column_name | (column_list) | * }
, 'freetext_string'
[ , LANGUAGE language_term ]
[ , top_n_by_rank ] )
参数
table
表的名称,该表已标记为全文查询。 表 或 视图可以是一个、两部分或三部分的数据库对象名称。 查询视图时,仅能涉及一个全文索引的基表。
table 无法指定服务器名称,并且不能在针对链接服务器的查询中使用。
column_name
FROM 子句中指定表的一个或多个全文索引列的名称。 列可以是 char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary 或 varbinary(max) 类型 。
column_list
指示可以指定多个列(以逗号分隔)。 column_list 必须用括号括起来。 除非指定 language_term,否则 column_list 中所有列的语言必须相同 。
*
指定所有注册全文搜索的列均应用于搜索给定的 freetext_string。 除非 指定language_term ,否则表中所有全文索引列的语言必须相同。
freetext_string
要在 column_name 中搜索的文本。 可以输入任何文本,包括单词、短语或句子。 只要在全文索引中找到任何术语或术语格式,就会生成匹配项。
与 CONTAINS 搜索条件(其中 AND 是关键字)不同,在 freetext_string “and”一词被视为干扰词或 非索引字,将被丢弃。
不允许使用 WEIGHT、FORMSOF、通配符、NEAR 和其他语法。 系统将通过同义词库对 freetext_string 进行断字处理、词干分析,然后执行同义词库查询。
LANGUAGE language_term
特定的语言,查询时,其资源将用于断字、词干分析、同义词库查询以及非索引字删除。 此参数是可选的,可以将其指定为与语言区域设置标识符 (LCID) 对应的字符串、整数或十六进制值。 如果指定了 language_term,则它表示的语言将应用于搜索条件的所有元素。 如果未指定值,则使用该列的全文语言。
如果将不同语言的文档一起作为二进制大型对象 (BLOB) 存储在单个列中,则指定文档的区域设置标识符 (LCID) 将决定对其内容编制索引时使用哪种语言。 在对这种列进行查询时,指定 LANGUAGE language_term 可增大找到有效匹配项的可能性。
如果指定为字符串,language_term 将对应于 sys.syslanguages (Transact-SQL) 兼容性视图中的 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 时适用。 如果 top_n_by_rank 与其他参数组合使用,则查询返回的行数可能会少于实际与所有谓词都匹配的行数。 top_n_by_rank 允许仅召回最相关的命中来提高查询性能。
注解
全文谓词和函数作用于 FROM 谓词所示的单个表。 若要对多个表进行搜索,请在 FROM 子句中使用联接表,以搜索由两个或更多个表的乘积构成的结果集。
FREETEXTTABLE 使用与 FREETEXT 谓词相同的搜索条件。
与 CONTAINSTABLE 一样,返回的表具有名为 KEY 和 RANK 的列,在查询中引用这些列以获取适当的行并使用行排名值。
权限
只有对指定表或表中所引用的列具有适当的 SELECT 权限的用户才能调用 FREETEXTTABLE。
示例
A. 简单示例
以下示例创建并填充两列的简单表,其中列出了 3 个县及其标志中的颜色。 它创建并填充表的全文目录和索引。 然后演示 FREETEXTTABLE 语法。
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 FREETEXTTABLE (Flags, FlagColors, 'Blue');
SELECT * FROM FREETEXTTABLE (Flags, FlagColors, 'Yellow');
B. 在 INNER JOIN 中使用 FREETEXT
以下示例返回与含义 high level of performance
匹配的任何产品的说明和排名。
USE AdventureWorks2022;
GO
SELECT FT_TBL.Description
,KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
INNER JOIN FREETEXTTABLE(Production.ProductDescription,
Description,
'high level of performance') AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
ORDER BY RANK DESC;
GO
°C 指定语言和排名最高的匹配项
以下示例完全相同,并演示了language_term和top_n_by_rank参数的使用LANGUAGE
。
USE AdventureWorks2022;
GO
SELECT FT_TBL.Description
,KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
INNER JOIN FREETEXTTABLE(Production.ProductDescription,
Description,
'high level of performance',
LANGUAGE N'English', 2) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
ORDER BY RANK DESC;
GO
注意
使用 top_n_by_rank 参数不需要 LANGUAGE language_term 参数。
另请参阅
全文搜索入门
创建和管理全文索引目录
CREATE FULLTEXT CATALOG (Transact-SQL)
CREATE FULLTEXT INDEX (Transact-SQL)
创建和管理全文索引
使用全文搜索查询
创建全文搜索查询 (Visual Database Tools)
CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
FREETEXT (Transact-SQL)
行集函数 (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
“预计算等级”服务器配置选项
比较Azure SQL 数据库和Azure SQL 托管实例中的功能