CREATE FULLTEXT INDEX (Transact-SQL)
为 SQL Server 内数据库中的表或索引视图创建全文索引。每个表或索引视图只允许有一个全文索引,并且每个全文索引会应用于单个表或索引视图。全文索引最多可以包含 1024 个列。
适用范围:SQL Server(SQL Server 2008 到当前版本)、SQL 数据库 V12。 |
语法
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 类型。仅当 type_column_name 指定 column_name 或 varbinary(max) 列时,才指定 TYPE COLUMN image,在该列中数据作为二进制数据存储;否则,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 存储过程访问 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 2012 到 SQL Server 2014。
创建作为统计语义索引一部分的附加关键短语和文档相似性索引。有关详细信息,请参阅语义搜索 (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 2012 到 SQL Server 2014。
将搜索属性列表与索引相关联。
OFF
指定不会将任何属性列表与全文索引相关联。property_list_name
指定要与全文索引关联的搜索属性列表的名称。
备注
有关全文索引的详细信息,请参阅创建和管理全文索引。
在 xml 列上,可以创建一个全文索引以便为 XML 元素的内容编制索引,但忽略 XML 标记。不为数值的属性值都会进行全文索引。元素标记用作标记边界。支持包含多种语言的格式正确的 XML 或 HTML 文档和片段。有关详细信息,请参阅对 XML 列使用全文搜索。
建议索引键列为整数数据类型。这可在执行查询时提供优化。
更改跟踪和 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.创建唯一索引、全文目录和全文索引
以下示例对 JobCandidateID 示例数据库中 HumanResources.JobCandidate 表的 AdventureWorks2012 列创建全文索引。然后,该示例创建一个默认全文目录 ft。最后,该示例使用 Resume 目录和系统非索引字表对 ft 列创建全文索引。
USE AdventureWorks2012;
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.为多个表列创建全文索引
以下示例在 production_catalog 示例数据库中创建一个全文目录 AdventureWorks。然后,该示例创建一个使用该新目录的全文索引。此全文索引位于 ReviewerName 的 EmailAddress、Comments 和 Production.ProductReview 列上。对于每个列,该示例指定英语的 LCID 1033,这是列中的数据语言。该全文索引使用现有的唯一键索引 PK_ProductReview_ProductReviewID。根据建议,此索引键位于整数列 ProductReviewID 中。
USE AdventureWorks2012;
GO
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 语句对新索引开始进行完全填充,并启用自动更改跟踪。
USE AdventureWorks2012;
GO
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
请参阅
创建和管理全文索引
ALTER FULLTEXT INDEX (Transact-SQL)
DROP FULLTEXT INDEX (Transact-SQL)
全文搜索
GRANT (Transact-SQL)
sys.fulltext_indexes (Transact-SQL)
使用搜索属性列表搜索文档属性