创建和管理 Full-Text 索引

Full-Text 引擎使用全文索引中的信息来编译全文查询,这些查询可以快速搜索表中的特定字词或字词组合。 全文索引将有关重要字词及其位置的信息存储在数据库表的一列或多列中。 全文索引是一种特殊的基于令牌的功能索引,由 sql Server 的 Full-Text 引擎生成和维护。 生成全文索引的过程不同于生成其他类型的索引。 Full-Text 引擎不是基于存储在特定行中的值构建 B 树结构,而是基于要编制索引的文本中的单个标记构建倒排、堆叠的压缩索引结构。 全文索引的大小仅受运行 SQL Server 实例的计算机的可用内存资源的限制。

从 SQL Server 2008 开始,全文索引与数据库引擎集成,而不是与以前版本的 SQL Server 一样驻留在文件系统中。 对于新数据库,全文目录现在是不属于任何文件组的虚拟对象;它只是引用一组全文索引的逻辑概念。 但是,请注意,在升级 SQL Server 2005 数据库期间,任何包含数据文件的全文目录都将创建一个新的文件组。有关详细信息,请参阅 升级 Full-Text 搜索

注释

在 SQL Server 2008 及更高版本中,Full-Text 引擎驻留在 SQL Server 进程中,而不是位于单独的服务中。 将 Full-Text 引擎集成到数据库引擎中可提高全文可管理性、混合查询优化和整体性能。

每个表只允许一个全文索引。 要对表创建全文索引,该表必须具有单个唯一的非空列。 可以在类型charvarcharncharnvarchartextntextimagexmlvarbinaryvarbinary(max)的列上生成全文索引,并可对其进行全文搜索。 创建数据类型为varbinaryvarbinary(max)imagexml的列的全文索引时,需要指定一个类型列。 类型列是一个表列,用于将文档的文件扩展名(.doc、.pdf、.xls等)存储在每行中。

创建和维护全文索引的过程称为 填充 (也称为 爬网)。 有三种类型的全文索引填充:完全填充、基于更改跟踪的填充和基于时间戳的增量填充。 有关详细信息,请参阅 填充全文索引

常见任务

创建全文索引

更改全文索引

删除全文索引

本主题内容

Full-Text 索引结构

充分了解全文索引的结构将帮助你了解 Full-Text 引擎的工作原理。 本主题使用 Adventure Works 中 Document 表的以下摘录作为示例表。 此摘录仅显示两列: DocumentID 列和 Title 列,以及表中的三行。

在本示例中,我们将假定已在 “标题 ”列上创建全文索引。

文档编号 标题
1 曲柄臂和轮胎维护
2 前反射器支架和反射器组件 3
3 正面反射器支架安装

例如,下表显示了 Fragment 1,描述了在文档表的“标题”列上创建的全文索引的内容。 全文索引包含的信息多于此表中显示的信息。 该表是全文索引的逻辑表示形式,仅用于演示目的。 行以压缩格式存储,以优化磁盘使用情况。

请注意,数据已从原始文档反转。 因为关键字被映射到文档 ID 上,所以发生了倒置。 因此,全文索引通常称为倒排索引。

另请注意,关键字“and”已从全文索引中删除。 这样做是因为“and”是停用词,从全文索引中删除停用词可以大幅节省磁盘空间,从而提高查询性能。 有关停用词的详细信息,请参阅 配置和管理 Full-Text 搜索的停用词和停用词列表

片段 1

关键字 ColId DocId 次数
曲柄 1 1 1
手臂 1 1 2
轮胎 1 1 4
维护 1 1 5
前面 1 2 1
前面 1 3 1
反射镜 1 2 2
反射镜 1 2 5
反射镜 1 3 2
支架 1 2 3
支架 1 3 3
集会 1 2 6
3 1 2 7
安装 1 3 4

Keyword 列包含索引时提取的单个标记的表示形式。 断字符确定构成令牌的内容。

ColId 列包含一个值,该值对应于为全文编制索引的特定列。

DocId 列包含八字节整数的值,该整数映射到全文索引表中的特定全文键值。 当全文键不是整数数据类型时,此映射是必需的。 在这种情况下,全文键值和 DocId 值之间的映射保留在名为 DocId 映射表的单独表中。 若要查询这些映射,请使用 sp_fulltext_keymappings 系统存储过程。 若要满足搜索条件,需要将上述表中的 DocId 值与 DocId 映射表联接,以便从要查询的基表检索行。 如果基表的全文键值是整数类型,则该值直接用作 DocId,无需映射。 因此,使用整数全文键值有助于优化全文查询。

Occurrence 列包含整数值。 对于每个 DocId 值,都有一个匹配值列表,这些值对应于该 DocId 中特定关键字的相对单词偏移量。 匹配值可用于确定短语或邻近匹配项,例如,短语具有数字相邻的匹配值。 它们在计算相关性分数方面也很有用;例如,DocId 中的关键字出现次数可用于评分。

本主题内容

Full-Text 索引片段

逻辑全文索引通常拆分为多个内部表。 每个内部表称为全文索引片段。 其中一些片段可能包含比其他片段新的数据。 例如,如果用户更新 DocId 为 3 且表是自动更改的以下行,则会创建一个新片段。

文档编号 标题
3 后反射器

在以下示例中,该片段显示了 Fragment 2,该片段包含有关 DocId 3 的较新数据,而片段是片段 1。 因此,当用户查询“后反射器”时,片段 2 中的数据将用于 DocId 3。 每个片段都标有一个创建时间戳,可以使用 sys.fulltext_index_fragments 目录视图进行查询。

片段 2

关键字 ColId DocId Occ
1 3 1
反射镜 1 3 2

如片段 2 所示,全文查询需要内部查询每个片段并丢弃较旧的条目。 因此,全文索引中的全文索引片段过多可能会导致查询性能大幅下降。 若要减少片段数,请使用 ALTER FULLTEXT CATALOGTransact-SQL 语句的 REORGANIZE 选项重新组织全文目录。 此语句执行 主合并,它将片段合并到单个较大的片段中,并从全文索引中删除所有过时的条目。

重新组织后,示例索引将包含以下行:

关键字 ColId DocId Occ
曲柄 1 1 1
手臂 1 1 2
1 1 4
维护 1 1 5
前面 1 2 1
1 3 1
反射镜 1 2 2
反射镜 1 2 5
反射镜 1 3 2
括号 1 2 3
集会 1 2 6
3 1 2 7

本主题内容