全文索引的结构

对全文索引的结构的良好了解将帮助您了解全文引擎如何工作。本主题使用 Adventure Works 中的 Document 表的以下摘录部分作为示例表。此摘录部分仅显示该表的两个列(DocumentID 列和 Title 列)和三行。

在下例中,我们假设已对 Title 列创建了全文索引。

DocumentID

Title

1

Crank Arm and Tire Maintenance

2

Front Reflector Bracket and Reflector Assembly 3

3

Front Reflector Bracket Installation

例如,下表(显示 Fragment 1)描述对 Document 表的 Title 列创建的全文索引的内容。与该表呈现的信息相比,全文索引包含更多信息。该表是全文索引的逻辑表示形式,并且仅为演示目的提供。行以压缩格式存储,以优化磁盘的使用。

注意,数据已从原始文档倒排。发生数据倒排是因为关键字映射到文档 ID。因此,全文索引通常称为倒排索引。

还要注意,已从全文索引中删除关键字“and”。这样做是因为“and”是非索引字,从全文索引中删除非索引字可以大幅节省磁盘空间,并因此提高查询性能。有关非索引字的详细信息,请参阅非索引字和非索引字表

Fragment 1

Keyword

ColId

DocId

Occurrence

Crank

1

1

1

Arm

1

1

2

Tire

1

1

4

Maintenance

1

1

5

Front

1

2

1

Front

1

3

1

Reflector

1

2

2

Reflector

1

2

5

Reflector

1

3

2

Bracket

1

2

3

Bracket

1

3

3

Assembly

1

2

6

3

1

2

7

Installation

1

3

4

Keyword 列包含在创建索引时提取的单个标记的表示形式。断字符可确定组成标记的词。

ColId 列包含的值对应于已建立全文索引的特定列。

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

Occurrence 列包含整数值。对于每个 DocId 值,均有一个 Occurrence 值的列表对应于该 DocId 值中特定关键字的相对字偏移量。位置值用于确定短语或邻近匹配项,例如具有相邻位置值的短语。它们还用于计算相关性分数,例如记分时可能会用某个关键字在 DocId 中的出现次数。

全文索引碎片

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

DocumentID

Title

3

Rear Reflector

在下面的示例(显示 Fragment 2)中,碎片中包含比 Fragment 1 中更新的关于 DocId 3 的数据。因此,当用户查询“Rear Reflector”时,会将 Fragment 2 中的数据用于 DocId 3。每个碎片都用一个创建时间戳来标记,可以使用 sys.fulltext_index_fragments 目录视图查询该时间戳。

Fragment 2

Keyword

ColId

DocId

Occ

Rear

1

3

1

Reflector

1

3

2

从 Fragment 2 可以看到,全文查询需要在内部查询每个碎片,并放弃更旧的条目。因此,全文索引中太多的全文索引碎片会导致查询性能大幅下降。若要减少碎片数,请使用 ALTER FULLTEXT CATALOGTransact-SQL 语句的 REORGANIZE 选项来重新组织全文目录。此语句将执行一次“主合并”,主合并将碎片合并成一个更大的碎片,并从全文索引中删除所有过时的条目。

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

Keyword

ColId

DocId

Occ

Crank

1

1

1

Arm

1

1

2

Tire

1

1

4

Maintenance

1

1

5

Front

1

2

1

Rear

1

3

1

Reflector

1

2

2

Reflector

1

2

5

Reflector

1

3

2

Bracket

1

2

3

Assembly

1

2

6

3

1

2

7