创建和管理全文索引
适用于: SQL Server
Azure SQL 数据库
Azure SQL 托管实例
本文介绍了如何在 SQL Server 中创建、填充和管理全文索引。
创建全文目录
必须具有全文目录,然后才能创建全文索引。 目录是包含一个或多个全文索引的虚拟容器。 有关详细信息,请参阅创建和管理全文目录。
创建、更改或删除全文索引
- CREATE FULLTEXT INDEX (Transact-SQL)
- ALTER FULLTEXT INDEX (Transact-SQL)
- DROP FULLTEXT INDEX (Transact-SQL)
填充全文索引
创建和维护全文索引的过程称为“填充”(也称为“爬网”)。 有三种类型的全文索引填充:
- 完全填充
- 基于更改跟踪的填充
- 基于时间戳的增量填充。
有关详细信息,请参阅 填充全文索引。
查看全文索引的属性
使用 Transact-SQL 查看全文索引的属性
目录视图或动态管理视图 | 说明 |
---|---|
sys.fulltext_index_catalog_usages (Transact-SQL) | 对于全文索引引用的每个全文目录,返回与其对应的一行。 |
sys.fulltext_index_columns (Transact-SQL) | 对构成全文索引的每列都包含一行。 |
sys.fulltext_index_fragments (Transact-SQL) | 全文索引使用内部表(称为“全文索引片断”)来存储倒排索引数据。 可以使用此视图来查询有关这些片断的元数据。 在此视图中,每个全文索引片断在每个包含全文索引的表中各占一行。 |
sys.fulltext_indexes (Transact-SQL) | 表对象的每个全文索引各占一行。 |
sys.dm_fts_index_keywords (Transact-SQL) | 返回有关指定表的全文索引内容的信息。 |
sys.dm_fts_index_keywords_by_document (Transact-SQL) | 返回有关指定表的文档级全文索引内容的信息。 给定关键字可以出现在几个文档中。 |
sys.dm_fts_index_population (Transact-SQL) | 返回有关当前正在进行的全文索引填充的信息。 |
使用 SQL Server Management Studio 查看全文索引的属性
注意
要查看 Azure SQL 数据库全文索引的属性,请使用 Transact-SQL。
在 SQL Server Management Studio 的对象资源管理器中展开服务器。
展开“数据库”,然后展开包含全文索引的数据库。
展开 “表”。
右键单击对其定义了全文索引的表,选择“全文索引”,然后在“全文索引”上下文菜单中选择“属性”。 此时将打开“全文索引属性”对话框。
在 “选择页” 窗格中,您可以选择下列页中的任一页:
页码 说明 常规 显示全文索引的基本属性。 这些基本属性包括多个可修改属性和多个不可更改属性,后者如数据库名称、表名和全文键列的名称。 可修改属性包括:
全文索引非索引字表
全文索引已启用
更改跟踪
搜索属性列表列数 显示可用于全文索引的表列。 对于选中的列,均会创建全文索引。 您可以根据需要选择将任意数目的可用列包括在全文索引中。 有关详细信息,请参阅填充全文索引。 计划 使用此页可以创建或管理 SQL Server 代理作业的计划,该作业用于启动全文索引填充的表增量填充。 有关详细信息,请参阅填充全文索引。
注意:在退出“全文索引属性”对话框之后,所有新创建的计划都将与 SQL Server 代理作业(对 database_name.table_name 启动表增量填充)相关联。选择“确定”,保存任何更改并退出“全文索引属性”对话框。
查看索引表和列的属性
一些 Transact-SQL 函数(例如 OBJECTPROPERTYEX)可用来获取各种全文索引属性的值。 此信息可用于全文搜索的管理和故障排除。
下表列出了与索引表和列相关的全文属性及其相关 Transact-SQL 函数。
properties | 说明 | Function |
---|---|---|
FullTextTypeColumn | 表中的 TYPE COLUMN,其中包含列的文档类型信息。 | COLUMNPROPERTY |
IsFulltextIndexed | 列是否启用了全文索引。 | COLUMNPROPERTY |
IsFulltextKey | 索引是否为表的全文键。 | INDEXPROPERTY |
TableFulltextBackgroundUpdateIndexOn | 表是否具有全文后台更新索引。 | OBJECTPROPERTYEX |
TableFulltextCatalogId | 表的全文索引数据所在的全文目录 ID。 | OBJECTPROPERTYEX |
TableFulltextChangeTrackingOn | 表是否启用了全文更改跟踪。 | OBJECTPROPERTYEX |
TableFulltextDocsProcessed | 自开始全文检索以来所处理的行数。 | OBJECTPROPERTYEX |
TableFulltextFailCount | 全文搜索未编制索引的行数。 | OBJECTPROPERTYEX |
TableFulltextItemCount | 成功编制了全文索引的行数。 | OBJECTPROPERTYEX |
TableFulltextKeyColumn | 全文唯一键列的列 ID。 | OBJECTPROPERTYEX |
TableFullTextMergeStatus | 具有全文索引的表当前是否正在合并。 | OBJECTPROPERTYEX |
TableFulltextPendingChanges | 要处理的挂起更改跟踪项的数目。 | OBJECTPROPERTYEX |
TableFulltextPopulateStatus | 全文表的填充状态。 | OBJECTPROPERTYEX |
TableHasActiveFulltextIndex | 表是否具有活动的全文索引。 | OBJECTPROPERTYEX |
获取关于全文键列的信息
通常情况下,CONTAINSTABLE 或 FREETEXTTABLE 行集值函数的结果需要与基表相联接。 在这样的情况下,需要知道唯一键列名称。 可以查询给定的唯一索引是否作为全文键使用,并且可以获取全文键列的标识符。
确定给定的唯一索引是否用作全文键列
使用 SELECT 语句调用 INDEXPROPERTY 函数。 在此函数的调用过程中,使用 OBJECT_ID 函数将表名 (table_name) 转换为表 ID,指定该表的唯一索引的名称,然后指定 IsFulltextKey 索引属性,如下所示:
SELECT INDEXPROPERTY(OBJECT_ID('table_name'), 'index_name', 'IsFulltextKey');
如果使用此索引来强制实现全文键列的唯一性,此语句返回 1,否则返回 0。
示例
下例查询 PK_Document_DocumentNode
索引是否用于强制实现全文键列的唯一性,如下所示:
USE AdventureWorks2022;
GO
SELECT INDEXPROPERTY(OBJECT_ID('Production.Document'), 'PK_Document_DocumentNode', 'IsFulltextKey');
如果使用 PK_Document_DocumentNode
索引来强制实现全文键列的唯一性,则此示例返回 1。 否则,它返回 0 或 NULL。 NULL 表示使用的是无效索引名称,索引名称与表不对应,或表不存在,等等。
查找全文键列的标识符
每个启用全文的表都有一个列,该列用于强制实现表中行的唯一性(唯一键列)。 从 OBJECTPROPERTYEX 函数获取的 TableFulltextKeyColumn 属性包含唯一键列的列 ID。
若要获取此标识符,可以使用 SELECT 语句调用 OBJECTPROPERTYEX 函数。 使用 OBJECT_ID 函数将表名 (table_name) 转换为表 ID,并指定 TableFulltextKeyColumn 属性,如下所示:
SELECT OBJECTPROPERTYEX(OBJECT_ID('table_name'), 'TableFulltextKeyColumn' ) AS 'Column Identifier';
示例
下例返回全文键列的标识符或 NULL。 NULL 表示使用的是无效索引名称,索引名称与表不对应,或表不存在,等等。
USE AdventureWorks2022;
GO
SELECT OBJECTPROPERTYEX(OBJECT_ID('Production.Document'), 'TableFulltextKeyColumn');
GO
下例说明如何使用唯一键列的标识符获取列的名称。
USE AdventureWorks2022;
GO
DECLARE @key_column 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 列可存储多种类型的文档。 SQL Server 支持安装了相应筛选器并且在操作系统中可用的任何文档类型。 每个文档的文档类型由该文档的文件扩展名标识。 例如,对于 .doc 文件扩展名,全文搜索将使用支持 Microsoft Word 文档的筛选器。 有关可用文档类型的列表,请查询 sys.fulltext_document_types 目录视图。
全文引擎可以使用操作系统中安装的现有筛选器。 在您可以使用操作系统筛选器、断字符和词干分析器之前,您必须将它们加载到服务器实例中,如下所示:
EXEC 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 中,默认情况下所有由用户创建的数据库都启用了全文索引。 另外,在为表创建全文索引并将列添加到索引之后,就会自动为单个表启用全文索引。 从表的全文索引中删除最后一列时,会自动为表禁用全文索引。
对于具有全文索引的表,可以使用 SQL Server Management Studio 手动为表禁用或重新启用全文索引。
展开服务器组,展开“数据库”,再展开包含要为其启用全文索引的表的数据库。
展开“表”,然后右键单击要为其禁用或重新启用全文索引的表。
选择“全文索引”,然后选择“禁用全文索引”或“启用全文索引”。
从表中删除全文索引
在对象资源管理器中,右键单击要删除的全文索引所在的表。
选择“删除全文索引”。
在出现提示时,选择“确定”,确认是否要删除该全文索引。