CREATE FULLTEXT INDEX (Transact-SQL)
语法
CREATE FULLTEXT INDEX ON table_name
[ ( { column_name
[ TYPE COLUMN type_column_name ]
[ LANGUAGE language_term ]
} [ ,...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 }
}
参数
table_name
包含全文索引中的一列或多列的表或索引视图的名称。column_name
全文索引中包含的列的名称。只能对类型为 char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary 和 varbinary(max) 的列创建全文搜索索引。若要指定多个列,请按如下方式重复 column_name 子句:CREATE FULLTEXT INDEX ON table_name (column_name1 […], column_name2 […]) …
TYPE COLUMN type_column_name
指定用于包含 varbinary、varbinary(max) 或 image 文档的文档类型的表列名称 (type_column_name)。此列(称为类型列)包含用户提供的文件扩展名(.doc、.pdf、.xls 等)。类型列必须是 char、nchar、varchar 或 nvarchar 类型。仅当 column_name 指定 varbinary、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 对应于 syslanguages 系统表中 alias 列的值。字符串必须用单引号引起来,如 'language_term'。如果指定为整数,则 language_term 就是标识该语言的实际 LCID。如果指定为十六进制值,则 language_term 将以 0x 开头,后跟 LCID 的十六进制值。十六进制值不能超过八位(包括前导零在内)。
如果该值是双字节字符集 (DBCS) 格式,则 SQL Server 会将其转换为 Unicode 格式。
对于指定为 language_term 的语言,必须启用断字符和词干分析器等资源。如果此类资源不支持指定的语言,则 SQL Server 将返回错误。
使用 sp_configure 存储过程可访问有关 MicrosoftSQL Server 实例的默认全文语言的信息。有关详细信息,请参阅 sp_configure (Transact-SQL) 和default full-text language 选项。
如果非 BLOB 和非 XML 列包含多种语言的文本数据,或者列中存储的文本的语言未知,则可能适合使用非特定 (0x0) 语言资源。但是,您应该先了解使用非特定 (0x0) 语言资源的可能后果。有关使用非特定 (0x0) 语言资源的可能解决方案和后果的信息,请参阅创建全文索引时选择语言的最佳实践。
对于存储在 XML 或 BLOB 类型列中的文档,在创建索引时,将使用文档内的语言编码。例如,在 XML 列中,XML 文档中的 xml:lang 属性将标识语言。在查询时,除非将 language_term 指定为全文查询的一部分,否则将使用以前在 language_term 中指定的值作为全文查询的默认语言。
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
指定要与全文索引关联的非索引字表的名称。
注释
有关全文索引的详细信息,请参阅配置数据库的全文目录和索引。
在 xml 列上,可以创建一个全文索引来为 XML 元素的内容创建索引,但忽略 XML 标记。不为数值的属性值都会进行全文索引。元素标记用作标记边界。支持包含多种语言的格式正确的 XML 或 HTML 文档和片段。有关详细信息,请参阅XML 列的全文索引。
建议索引键列为整数数据类型。这可在执行查询时提供优化。
更改跟踪和 NO POPULATION 参数的交互
是否填充全文索引取决于是否启用了更改跟踪以及在 ALTER FULLTEXT INDEX 语句中是否指定了 WITH NO POPULATION。下表概述了其交互结果。
更改跟踪 |
WITH NO POPULATION |
结果 |
---|---|---|
未启用 |
未指定 |
对索引执行完全填充。 |
未启用 |
指定 |
在发出 ALTER FULLTEXT INDEX...START POPULATION 语句之前,不会进行任何索引填充。 |
启用 |
指定 |
引发错误,并且不会更改索引。 |
启用 |
未指定 |
对索引执行完全填充。 |
有关填充全文索引的详细信息,请参阅全文索引填充.
权限
用户必须对全文目录拥有 REFERENCES 权限,对表或索引视图拥有 ALTER 权限,或者必须是 sysadmin 固定服务器角色、db_owner 或 db_ddladmin 固定数据库角色的成员。
如果指定了 SET STOPLIST,则用户必须对指定的非索引字表拥有 REFERENCES 权限。此 STOPLIST 的所有者可授予此权限。
注意 |
---|
授予 public 对 SQL Server 随附的默认非索引字表的 REFERENCE 权限。 |
示例
A. 创建唯一索引、全文目录和全文索引
下面的示例对 AdventureWorks 示例数据库中 HumanResources.JobCandidate 表的 JobCandidateID 列创建全文索引。然后,该示例创建一个默认全文目录 ft。最后,该示例使用 ft 目录和系统非索引字表对 Resume 列创建全文索引。
USE AdventureWorks;
GO
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. 对多个表列创建全文索引
下面的示例对 AdventureWorks 示例数据库中 Production.ProductReview 表的 ReviewerName、EmailAddress 和 Comments 列创建全文索引。对于每一个列,该示例指定英语的 LCID 1033,即列中数据的语言。此全文索引使用默认的全文目录和现有的唯一键索引 PK_ProductReview_ProductReviewID。根据建议,此索引键位于整数列 ProductReviewID 上。
USE AdventureWorks;
GO
CREATE FULLTEXT INDEX ON Production.ProductReview
(
ReviewerName
Language 1033,
EmailAddress
Language 1033,
Comments
Language 1033
)
KEY INDEX PK_ProductReview_ProductReviewID ;
GO
C. 创建全文索引但不进行填充
下面的示例在 AdventureWorks 示例数据库中创建一个全文目录 documents_catalog。然后,该示例创建一个使用此新目录的全文索引。此全文索引位于 Production.Document 表的 Document 列上。该示例指定英语的 LCID 1033,即列中数据的语言。此全文索引使用默认的全文目录和现有的唯一键索引 PK_Document_DocumentID。根据建议,此索引键位于整数列 DocumentID 上。该示例指定更改跟踪处于关闭状态且不进行填充。随后,在非峰值时间,该示例使用 ALTER FULLTEXT INDEX 语句对新索引开始进行完全填充,并启用自动更改跟踪。
USE AdventureWorks;
GO
CREATE FULLTEXT CATALOG documents_catalog;
GO
CREATE FULLTEXT INDEX ON Production.Document
( Document
TYPE COLUMN FileExtension
Language 1033 )
KEY INDEX PK_Document_DocumentID
ON documents_catalog
WITH CHANGE_TRACKING OFF, NO POPULATION;
GO
随后,在非峰值时间,填充索引:
ALTER FULLTEXT INDEX ON Production.Document SET CHANGE_TRACKING AUTO;
GO
更改历史记录
更新的内容 |
---|
在“示例”部分添加了更多示例。 |
添加了“更改跟踪和 NO POPULATION 参数的交互”部分。 |