CREATE FULLTEXT INDEX (Transact-SQL)
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例
为 SQL Server 内数据库中的表或索引视图创建全文索引。 每个表或索引视图只允许有一个全文索引,并且每个全文索引会应用于单个表或索引视图。 全文索引最多可以包含 1024 个列。
语法
CREATE FULLTEXT INDEX ON table_name
[ ( { column_name
[ TYPE COLUMN type_column_name ]
[ LANGUAGE language_term ]
[ STATISTICAL_SEMANTICS ]
} [ , ...n ]
) ]
KEY INDEX index_name
[ ON <catalog_filegroup_option> ]
[ WITH ( <with_option> [ , ...n ] ) ]
[;]
<catalog_filegroup_option>::=
{
fulltext_catalog_name
| ( fulltext_catalog_name , FILEGROUP filegroup_name )
| ( FILEGROUP filegroup_name , fulltext_catalog_name )
| ( FILEGROUP filegroup_name )
}
<with_option>::=
{
CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [ , NO POPULATION ] }
| STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }
| SEARCH PROPERTY LIST [ = ] property_list_name
}
参数
table_name
包含全文检索中的一列或多列的表或索引视图的名称。
column_name
全文检索中包含的列的名称。 只能为 char、varchar、nchar、nvarchar、text、ntext、image、xml 和 varbinary(max) 类型的列编制索引,以供全文搜索使用。 若要指定多个列,请按如下方式重复 column_name 子句:
CREATE FULLTEXT INDEX ON table_name (column_name1 [...], column_name2 [...]) ...
TYPE COLUMN type_column_name
指定表列的名称 type_column_name,用于存储 varbinary(max) 或 image 文档的文档类型。 此列(称为类型列)包含用户提供的文件扩展名(.doc、.pdf、.xls 等)。 类型列必须是 char、 nchar、 varchar或 nvarchar类型。
仅当 column_name 指定 varbinary(max) 或 image 列(数据作为二进制数据存储在该列中)时,才指定 TYPE COLUMN type_column_name;否则 SQL Server 将返回错误。
注意
在建立索引时,全文引擎使用每个表行的类型列中的缩写来标识对 column_name 中的文档使用哪个全文搜索筛选器。 筛选器按二进制流加载文档,并删除格式设置信息,然后将文档中的文本发送到断字器组件。 有关详细信息,请参阅 配置和管理搜索筛选器。
LANGUAGE language_term
存储在 column_name 中的数据的语言。
language_term 是可选的,可以将其指定为与语言区域设置标识符 (LCID) 对应的字符串、整数或十六进制值。 如果未指定值,则使用 SQL Server 实例的默认语言。
如果指定了 language_term,则使用它代表的语言对存储在 char、nchar、varchar、nvarchar、text 和 ntext 列中的数据编制索引。 如果未针对列将 language_term 指定为全文谓词的一部分,则该语言就是查询时使用的默认语言。
如果指定为字符串,则 language_term 对应于 sys.syslanguages
系统表中的 alias 列值。 字符串必须用单引号引起来,如 'language_term'。 如果指定为整数,则 language_term 就是标识该语言的实际 LCID。 如果指定为十六进制值,则 language_term 将以 0x
开头,后跟 LCID 的十六进制值。 十六进制值不能超过八位(包括前导零在内)。
如果该值是双字节字符集 (DBCS) 格式,则 SQL Server 将其转换为 Unicode 格式。
对于指定为 language_term 的语言,必须启用断字符和词干分析器等资源。 如果此类资源不支持指定的语言,SQL Server 将返回错误。
使用 sp_configure
存储过程可访问有关 Microsoft SQL Server 实例的默认全文语言信息。 有关详细信息,请参阅 sp_configure (Transact-SQL)。
如果非 BLOB 和非 XML 列包含多种语言的文本数据,或者列中存储的文本的语言未知,则可能适合使用非特定 (0x0
) 语言资源。 但是,你应该先了解使用非特定 (0x0
) 语言资源的可能后果。 有关使用非特定 (0x0
) 语言资源的可能解决方案和后果的信息,请参阅创建全文检索时选择语言。
对于存储在 XML 或 BLOB 类型列中的文档,在创建索引时,使用文档内的语言编码。 例如,在 XML 列中,XML 文档中的 xml:lang
属性将标识语言。 在查询时,除非将 language_term 指定为全文查询的一部分,否则将使用以前在 language_term 中指定的值作为全文查询的默认语言。
STATISTICAL_SEMANTICS
适用于:SQL Server(SQL Server 2012 (11.x) 及更高版本)
创建作为统计语义索引一部分的附加关键短语和文档相似性索引。 有关详细信息,请参阅语义搜索 (SQL Server)。
KEY INDEX index_name
table_name 的唯一键索引的名称。 KEY INDEX 必须是唯一的单键列,不可为 Null。 为全文唯一键选择最小的唯一键索引。 为获得最佳性能,建议全文键使用整数数据类型。
fulltext_catalog_name
用于全文检索的全文目录。 数据库中必须已存在该目录。 此子句为可选项。 如果未指定,则使用默认目录。 如果默认目录不存在,SQL Server 将返回错误。
FILEGROUP filegroup_name
针对指定的文件组创建指定的全文索引。 该文件组必须已存在。 如果未指定 FILEGROUP 子句,则全文检索位于与基表或视图相同的文件组中(对于非分区表),或者位于主文件组中(对于分区表)。
CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [ , NO POPULATION ] }
指定是否由 SQL Server 将对全文检索所覆盖的表列所做的更改(更新、删除或插入)传播到全文索引。 通过 WRITETEXT 和 UPDATETEXT 所做的数据更改不会反映到全文检索中,也不能使用更改跟踪方法拾取。
MANUAL
指定必须通过调用 ALTER FULLTEXT INDEX ... START UPDATE POPULATION Transact-SQL 语句来手动传播被跟踪的更改(手动填充)。 可以使用 SQL Server 代理来定期调用此 Transact-SQL 语句。
AUTO
指定当基表中的数据修改时,所跟踪的更改将会自动传播(自动填充)。 尽管是自动传播更改,但这些更改可能不会立即反映到全文检索中。 默认值为 AUTO。
OFF [ , NO POPULATION ]
指定 SQL Server 不保存对索引数据的更改的列表。 如果未指定 NO POPULATION,则 SQL Server 创建索引后将对其进行完全填充。
仅当 CHANGE_TRACKING 为 OFF 时,才能使用 NO POPULATION 选项。 如果指定了 NO POPULATION,则 SQL Server 在创建索引后不会对其进行填充。 仅当用户使用 START FULL POPULATION 或 START INCREMENTAL POPULATION 子句执行 ALTER FULLTEXT INDEX 命令之后,才会填充索引。
STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }
将全文非索引字表与索引关联起来。 不使用属于指定非索引字表的任何令牌填充索引。 如果未指定 STOPLIST,则 SQL Server 会将系统全文非索引字表与索引关联起来。
OFF
指定没有与全文检索关联的非索引字表。
SYSTEM
指定应对此全文索引使用默认的全文系统 STOPLIST。
stoplist_name
指定要与全文索引关联的非索引字表的名称。
SEARCH PROPERTY LIST [ = ] property_list_name
适用于:SQL Server(SQL Server 2012 (11.x) 及更高版本)
将搜索属性列表与索引相关联。
OFF
指定不会将任何非索引字表与全文检索相关联。
property_list_name
指定要与全文索引关联的搜索属性列表的名称。
注解
在 xml 列上,可以创建一个全文检索以便为 XML 元素的内容编制索引,但忽略 XML 标记。 不为数值的属性值都会进行全文索引。 元素标记用作标记边界。 支持包含多种语言的格式正确的 XML 或 HTML 文档和片段。 有关详细信息,请参阅 结合使用具有全文搜索和 XML 列。
建议索引键列为整数数据类型。 这可在执行查询时提供优化。
CREATE FULLTEXT INDEX 不能放置在用户事务中。 此语句必须在自己的隐式事务中运行。
有关详细信息,请参阅创建和管理全文检索。
更改跟踪和 NO POPULATION 参数的交互
是否填充全文索引取决于是否启用了更改跟踪以及在 ALTER FULLTEXT INDEX 语句中是否指定了 WITH NO POPULATION。 下表概述了其交互结果。
更改跟踪 | WITH NO POPULATION | 结果 |
---|---|---|
未启用 | 未指定 | 对索引执行完全填充。 |
未启用 | Specified | 在发出 ALTER FULLTEXT INDEX...START POPULATION 语句之前,不会进行任何索引填充。 |
已启用 | Specified | 引发错误,并且不会更改索引。 |
已启用 | 未指定 | 对索引执行完全填充。 |
有关填充全文检索的详细信息,请参阅填充全文检索。
权限
用户必须具有全文目录的 REFERENCES
权限以及表或索引视图的 ALTER
权限,或者必须是 sysadmin
固定服务器角色的成员、db_owner
固定数据库角色的成员或 db_ddladmin
固定数据库角色的成员。
如果指定了 SET STOPLIST
,则用户必须具有指定非索引字表的 REFERENCES 权限。 此 STOPLIST 的所有者可授予此权限。
注意
授予 public 对 SQL Server 随附的默认非索引字表的 REFERENCE 权限。
示例
A. 创建唯一索引、全文目录和全文检索
以下示例对 AdventureWorks2022 示例数据库中 HumanResources.JobCandidate
表的 JobCandidateID
列创建全文检索。 然后,该示例创建一个默认全文目录 ft
。 最后,该示例使用 Resume
目录和系统非索引字表对 ft
列创建全文索引。
CREATE UNIQUE INDEX ui_ukJobCand ON HumanResources.JobCandidate(JobCandidateID);
CREATE FULLTEXT CATALOG ft AS DEFAULT;
CREATE FULLTEXT INDEX ON HumanResources.JobCandidate(Resume)
KEY INDEX ui_ukJobCand
WITH STOPLIST = SYSTEM;
GO
B. 为多个表列创建全文检索
以下示例在 production_catalog
示例数据库中创建一个全文目录 AdventureWorks
。 然后,该示例创建一个使用该新目录的全文检索。 此全文检索位于 ReviewerName
的 EmailAddress
、Comments
和 Production.ProductReview
列上。 对于每个列,该示例指定英语的 LCID 1033
,这是列中的数据语言。 该全文索引使用现有的唯一键索引 PK_ProductReview_ProductReviewID
。 根据建议,此索引键位于整数列 ProductReviewID
中。
CREATE FULLTEXT CATALOG production_catalog;
GO
CREATE FULLTEXT INDEX ON Production.ProductReview (
ReviewerName LANGUAGE 1033,
EmailAddress LANGUAGE 1033,
Comments LANGUAGE 1033
) KEY INDEX PK_ProductReview_ProductReviewID ON production_catalog;
GO
°C 使用搜索属性列表创建全文检索而不填充该索引
以下示例为 Title
表的 DocumentSummary
、Document
和 Production.Document
列创建全文检索。 该示例指定英语的 LCID 1033
,这是列中的数据语言。 此全文索引使用默认的全文目录和现有的唯一键索引 PK_Document_DocumentID
。 根据建议,此索引键位于整数列 DocumentID
中。
该示例指定 SYSTEM 非索引字表。 它还指定搜索属性列表 DocumentPropertyList
;有关创建该属性列表的示例,请参阅 CREATE SEARCH PROPERTY LIST (Transact-SQL)。
该示例指定关闭更改跟踪并且不进行填充。 随后,在非峰值时间,该示例使用 ALTER FULLTEXT INDEX 语句对新索引开始进行完全填充,并启用自动更改跟踪。
CREATE FULLTEXT INDEX ON Production.Document (
Title LANGUAGE 1033,
DocumentSummary LANGUAGE 1033,
Document TYPE COLUMN FileExtension LANGUAGE 1033
) KEY INDEX PK_Document_DocumentID
WITH STOPLIST = SYSTEM,
SEARCH PROPERTY LIST = DocumentPropertyList,
CHANGE_TRACKING OFF,
NO POPULATION;
GO
随后,在非峰值时间,填充索引:
ALTER FULLTEXT INDEX ON Production.Document SET CHANGE_TRACKING AUTO;
GO