相关文章推荐
唠叨的薯片  ·  家居行业 CXO ...·  1 年前    · 
稳重的豆腐  ·  奋进新征程 ...·  2 年前    · 
文雅的小蝌蚪  ·  SqlAlchemy ...·  3 年前    · 

本文介绍了如何在 SQL Server 中创建、填充和管理全文索引。

创建全文目录

必须具有全文目录,然后才能创建全文索引。 目录是包含一个或多个全文索引的虚拟容器。 有关详细信息,请参阅 创建和管理全文目录

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

CREATE FULLTEXT INDEX (Transact-SQL) ALTER FULLTEXT INDEX (Transact-SQL) DROP FULLTEXT INDEX (Transact-SQL)

填充全文索引

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

  • 基于更改跟踪的数据填充
  • 基于时间戳的增量填充。
  • 有关详细信息,请参阅 填充全文索引

    查看全文索引的属性

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

    目录视图或动态管理视图

    获取关于全文键列的信息

    通常情况下,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;
    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;
    SELECT OBJECTPROPERTYEX(OBJECT_ID('Production.Document'), 'TableFulltextKeyColumn');
    

    下例说明如何使用唯一键列的标识符获取列的名称。

    USE AdventureWorks2022;
    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';
    

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

    索引 varbinary(max) 和 XML 列

    如果 varbinary(max)varbinaryxml 列是全文索引列,则与任何其他全文索引列一样,可以使用全文谓词(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 手动为表禁用或重新启用全文索引。

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

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

  • 选择“全文索引”,然后选择“禁用全文索引”或“启用全文索引”

    从表中删除全文索引

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

  • 选择“删除全文索引”。

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

    全文搜索和语义搜索存储过程 (Transact-SQL)
  • 创建和管理全文索引目录