CREATE FULLTEXT INDEX (Transact-SQL)

 

为 SQL Server 内数据库中的表或索引视图创建全文索引。每个表或索引视图只允许有一个全文索引,并且每个全文索引会应用于单个表或索引视图。全文索引最多可以包含 1024 个列。

适用范围:SQL Server(SQL Server 2008 到当前版本)、SQL 数据库 V12。

主题链接图标Transact-SQL 语法约定

语法

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
    全文索引中包含的列的名称。只能对类型为 charvarcharncharnvarchartextntextimagexmlvarbinary(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 等)。类型列必须是 charncharvarcharnvarchar 类型。

    仅当 type_column_name 指定 column_namevarbinary(max) 列时,才指定 TYPE COLUMN image,在该列中数据作为二进制数据存储;否则,SQL Server 将返回错误。

    备注

    在建立索引时,全文引擎使用每个表行的类型列中的缩写来标识对 column_name 中的文档使用哪个全文搜索筛选器。筛选器按二进制流加载文档,并删除格式设置信息,然后将文档中的文本发送到断字器组件。有关详细信息,请参阅配置和管理搜索筛选器

  • LANGUAGE language_term
    存储在 column_name 中的数据的语言。

    language_term 为可选参数,可以将其指定为与语言区域设置标识符 (LCID) 对应的字符串、整数或十六进制值。如果未指定任何值,则使用 SQL Server 实例的默认语言。

    如果指定了 language_term,则它表示的语言将用于对存储在 charncharvarcharnvarchartextntext 列中的数据进行索引。如果未针对列将 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)
使用搜索属性列表搜索文档属性