创建和管理全文索引

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

本文介绍了如何在 SQL Server 数据库引擎 中创建、填充和管理全文索引。 全文索引支持对表格中基于字符的列进行关键词和语言搜索。

创建全文目录

在创建全文索引之前,你需要一个全文目录。 目录是包含一个或多个全文索引的虚拟容器。 更多信息请参见 创建和管理 Full-Text 目录。

创建、更改或删除全文索引

填充全文索引

创建和维护全文索引的过程称为“填充”(也称为“爬网”)。 有三种类型的全文索引填充:

  • Full 填充
  • 基于更改跟踪的填充
  • 基于时间戳的增量填充

有关详细信息,请参阅 填充全文索引。

查看全文索引的属性

使用 Transact-SQL 查看全文索引的属性

目录视图或动态管理视图 说明
sys.fulltext_index_catalog_usages 对于全文索引引用的每个全文目录,返回与其对应的一行。
sys.fulltext_index_columns 对构成全文索引的每列都包含一行。
sys.fulltext_index_fragments 全文索引使用称为全文索引片段的内部表来存储倒置索引数据。 你可以用这个视图查询这些片段的元数据。 在此视图中,每个全文索引片断在每个包含全文索引的表中各占一行。
sys.fulltext_indexes 表对象的每个全文索引各占一行。
sys.dm_fts_index_keywords 返回有关指定表的全文索引内容的信息。
sys.dm_fts_index_keywords_by_document 返回有关指定表的文档级全文索引内容的信息。 给定关键字可以出现在几个文档中。
sys.dm_fts_index_population 返回关于当前正在进行的全文索引填充的信息。

使用 SQL Server Management Studio 查看全文索引的属性

注意

要查看 Azure SQL 数据库全文索引的属性,请使用 Transact-SQL。

  1. 在 SQL Server Management Studio 的对象资源管理器中展开服务器。

  2. 展开Databases,然后展开包含全文索引的数据库。

  3. 展开 表。

  4. 右键单击对其定义了全文索引的表,选择“全文索引”,然后在“全文索引”上下文菜单中选择“属性”。 此操作会打开 全文索引 属性对话框。

  5. 在 “选择页面 ”面板中,选择以下任一页面:

    页面 说明
    常规 显示全文索引的基本属性。 这些属性包括若干可修改的属性和许多不可更改的属性,如数据库名称、表名和全文键列名称。 可修改属性包括:

    全文索引停用词列表

    全文索引已启用

    变更跟踪

    搜索属性列表
    列 显示可用于全文索引的表列。 所选的一个或多个列已建立全文索引。 您可以根据需要选择将任意数目的可用列包括在全文索引中。 有关详细信息,请参阅 填充全文索引。
    计划 使用此页可以创建或管理 SQL Server 代理作业的计划,该作业用于启动全文索引填充的表增量填充。 有关详细信息,请参阅 填充全文索引。

    注意:退出 全文索引属性 对话框后,任何新创建的计划都会与一个 SQL Server 代理 作业相关联(在 database_name.table_name 上启动增量表填充)。
  6. 选择“确定”,保存任何更改并退出“全文索引属性”对话框。

查看索引表和列的属性

你可以使用多种 Transact-SQL 函数,例如 OBJECTPROPERTYEX,来获取各种全文索引属性的值。 此信息可用于全文搜索的管理和故障排除。

下表列出了与索引表和列相关的全文属性及其相关 Transact-SQL 函数。

属性 说明 功能
FullTextTypeColumn TYPE COLUMN 在包含该列文档类型信息的表格中。 COLUMNPROPERTY
是否已建立全文索引 指定列是否启用全文索引。 COLUMNPROPERTY
IsFulltextKey 索引是否为表的全文键。 INDEXPROPERTY
TableFulltextBackgroundUpdateIndexOn 表是否具有全文后台更新索引。 OBJECTPROPERTYEX
TableFulltextCatalogId 表的全文索引数据所在的全文目录 ID。 OBJECTPROPERTYEX
表全文更改跟踪开启 表是否启用了全文更改跟踪。 OBJECTPROPERTYEX
TableFulltextDocsProcessed 自开始全文检索以来所处理的行数。 OBJECTPROPERTYEX
TableFulltextFailCount 全文搜索未编制索引的行数。 OBJECTPROPERTYEX
TableFulltextItemCount 成功建立全文索引的行数。 OBJECTPROPERTYEX
TableFulltextKeyColumn 全文唯一键列的列 ID。 OBJECTPROPERTYEX
TableFullTextMergeStatus 具有全文索引的表当前是否处于合并过程中。 OBJECTPROPERTYEX
TableFulltextPendingChanges 待处理的更改跟踪条目数 OBJECTPROPERTYEX
TableFulltextPopulateStatus 全文表的填充状态。 OBJECTPROPERTYEX
TableHasActiveFulltextIndex 表是否有已启用的全文索引。 OBJECTPROPERTYEX

获取有关全文键列的信息

通常,你会将行集值函数的结果与基表连接CONTAINSTABLEFREETEXTTABLE。 在这样的情况下,需要知道唯一键列名称。 你可以检查某个唯一索引是否被用作全文键,并且可以获得全文键列的标识符。

确定给定的唯一索引是否用作全文键列

使用 SELECT 语句调用 INDEXPROPERTY 函数。 在函数调用中,使用该 OBJECT_ID 函数将表( table_name)的名称转换为表 ID,指定表的唯一索引名称,并指定 IsFulltextKey 索引属性,具体如下:

SELECT INDEXPROPERTY(OBJECT_ID('table_name'), 'index_name', 'IsFulltextKey');

如果索引对全文键列实施唯一性约束,则该语句返回1;如果不实施,则返回0。

示例

以下示例检查 PK_Document_DocumentNode 索引是否对全文键列强制唯一性:

USE AdventureWorks2025;
GO

SELECT INDEXPROPERTY(OBJECT_ID('Production.Document'), 'PK_Document_DocumentNode', 'IsFulltextKey');

如果 PK_Document_DocumentNode 索引强制全文键列的唯一性,则该示例返回1。 否则,返回0或 NULL。 NULL 这意味着你用了无效的索引名,索引名和表不对应,表不存在,等等。

查找全文键列的标识符

每个启用全文的表都有一个强制表唯一行的列(唯一键列)。 TableFulltextKeyColumn该属性由OBJECTPROPERTYEX函数获得,包含唯一键列的列 ID。

要获取此标识符,请使用调用 OBJECTPROPERTYEX 函数的 SELECT 语句。 使用函数 OBJECT_ID 将表 (table_name) 的名称转换为表 ID,并指定 TableFulltextKeyColumn 属性,具体如下:

SELECT OBJECTPROPERTYEX(OBJECT_ID('table_name'), 'TableFulltextKeyColumn') AS 'Column Identifier';

示例

以下示例返回全文键列的标识符或 NULL。 NULL 意味着你用的是无效的索引名,索引名不对应表,表不存在,等等。

USE AdventureWorks2025;
GO

SELECT OBJECTPROPERTYEX(OBJECT_ID('Production.Document'), 'TableFulltextKeyColumn');
GO

以下示例展示了如何使用唯一密钥列的标识符来获取列名。

USE AdventureWorks2025;
GO

DECLARE @key_column AS SYSNAME;

SET @key_column = COL_NAME(
    OBJECT_ID('Production.Document'),
    OBJECTPROPERTYEX(OBJECT_ID('Production.Document'), 'TableFulltextKeyColumn')
);

SELECT @key_column AS 'Unique Key Column';
GO

此示例返回一个名为 Unique Key Column 的结果集列,该列显示单行数据,其中包含 Document 表的唯一键列 DocumentNode 的名称。 如果查询包含无效的索引名,索引名与表不对应,表不存在,等等,返回 NULL。

索引 varbinary(max) 和 XML 列

如果你对varbinary(max)、varbinary或xml列进行全文索引,可以通过使用全文谓词(CONTAINS和FREETEXT)和函数(CONTAINSTABLE和FREETEXTTABLE)查询,就像其他全文索引列一样。

为 varbinary(max) 或 varbinary 数据创建索引

单个 varbinary(max) 或 varbinary 列可存储多种类型的文档。 数据库引擎支持任何在操作系统中安装了相应筛选器且该筛选器可用的文档类型。 每个文档的文档类型由该文档的文件扩展名标识。 例如,对于.doc文件扩展名,全文搜索使用支持Microsoft Word文档的过滤器。 有关可用文档类型的列表,请查询 sys.fulltext_document_types 目录视图。

全文引擎可以使用操作系统中安装的现有筛选器。 在可以使用操作系统筛选器、断字符和词干分析器之前,必须将它们加载到服务器实例中,如下所示:

EXECUTE sp_fulltext_service
    @action = 'load_os_resources',
    @value = 1;

若要对 varbinary(max) 列创建全文索引,全文引擎需要访问 varbinary(max) 列中文档的文件扩展名。 你必须将这些信息存储在一个称为类型列的表列中,并与全文索引中的 varbinary(max) 列关联。 在为文档创建索引时,全文引擎将使用类型列中的文件扩展名来标识要使用的筛选器。

为 XML 数据建立索引

xml 数据类型列仅存储 XML 文档和片段,并且只有 XML 筛选器用于此类文档。 因此,无需类型列。 在 xml 列上,全文索引会为 XML 元素的内容创建索引,但会忽略 XML 标记。 除非属性值为数值,否则会被编入全文索引。 元素标记用作标记边界。 支持包含多种语言的格式正确的 XML 或 HTML 文档和片段。

关于对 XML 列进行索引和查询的更多信息,请参见 “使用全文搜索与XML列”。

禁用或重新启用表的全文索引

在 数据库引擎 中,所有用户创建的数据库默认都启用了全文。 另外,在为表创建全文索引并将列添加到索引之后,就会自动为单个表启用全文索引。 当从该表的全文索引中删除最后一列时,该表将自动禁用全文索引。

对于拥有全文索引的表,您可以使用 SQL Server Management Studio 手动禁用或重新启用全文索引表。

  1. 展开服务器组,展开数据库,再展开包含要启用全文索引的表的数据库。

  2. 展开表,然后右键单击要禁用或重新启用全文索引的表。

  3. 选择“全文索引”,然后选择“禁用全文索引”或“启用全文索引”。

从表中删除全文索引

  1. 在对象资源管理器中,右键单击要删除的全文索引所在的表。

  2. 选择“删除全文索引”。

  3. 在出现提示时,选择“确定”,确认是否要删除该全文索引。