在 SQLite 数据库的全文搜索 (FTS) 模块中,有一些内部表和结构用于存储和管理全文搜索索引的数据。对于这些表项,docsize
, segdir
, segments
, stat
等是重要的组成部分,它们之间相互配合,来有效地管理全文索引数据。以下是它们的作用及相互关系:
1. docsize
docsize
是 SQLite FTS 模块的一个内部表,主要用于存储每个文档(或记录)的字段大小信息。
-
作用:记录了全文索引文档中每个字段的词频信息(即每个字段中包含的单词数量)。
-
用途:在处理全文查询时,它帮助评估某些相关性评分,比如 TF-IDF,来判断某个文档与查询的匹配度。
-
结构 :
docsize
通常存储文档 ID 和每个字段的词频。sqlCREATE TABLE docsize ( docid INTEGER PRIMARY KEY, size BLOB );
2. segdir
segdir
是 FTS5 索引中的目录表,用于存储段(segments)及其相关信息。段是存储全文索引的基本单元。
-
作用:描述了每个段的元数据,包括每个段的 ID、层次、范围等。
-
用途:帮助定位和管理多个段的信息,使查询可以快速定位到相关的段进行搜索。
-
结构:存储每个段的标识符、开始和结束文档的 ID 范围、以及其他元数据。
sqlCREATE TABLE segdir ( level INTEGER, idx INTEGER, start_block INTEGER, leaves_end_block INTEGER, end_block INTEGER, root BLOB, PRIMARY KEY(level, idx) );
-
层次结构 :
segdir
中的段通常按层次组织,每一层由多个段组成。在查询时,SQLite 会合并多个段以提高查询效率。
3. segments
segments
是存储全文索引数据的实际内容。每个段(segment)是一个倒排索引,保存了单词到文档的映射关系。
- 作用:存储每个文档中每个词出现的位置、频率等详细信息,通常以压缩格式存储以节省空间。
- 用途 :用于快速检索包含特定关键字的文档和位置。查询时,会通过
segdir
表的信息,找到对应的segments
进行搜索。 - 结构:每个段可以存储很多块(block),每个块包含一部分倒排索引信息。
4. stat
stat
表存储了全文索引的统计信息,包括文档的总数量、总词汇量等。
-
作用 :提供统计信息来帮助优化查询性能。例如,可以根据
stat
中的词频信息,优化查询时的相关性排序。 -
用途 :
stat
表信息可以用来在查询时快速评估某些匹配词的稀有性,从而调整查询结果的排序(例如使用 TF-IDF 或 BM25 等算法)。sqlCREATE TABLE stat ( id INTEGER PRIMARY KEY, value BLOB );
这些表和概念之间的关系
segdir
充当段的目录表,描述了所有存储在segments
中的段的元数据。segments
是实际存储倒排索引的表,保存每个文档中单词出现的位置和频率。docsize
表保存了每个文档中字段的词频信息,用于计算文档的相关性评分。stat
表记录了全文索引的整体统计信息,帮助优化查询和排名。
查询过程简述
- 当执行全文搜索查询时,SQLite 会先通过
segdir
定位到哪些段(segments
)中可能包含目标关键字。 - 然后使用
segments
中的倒排索引,快速找到包含该关键字的文档。 docsize
帮助进一步计算相关性分数,基于词频和文档长度等信息。- 最后,
stat
表中的统计数据用来优化结果排序和查询性能。
这些结构一起协同工作,确保 SQLite 的全文搜索能够高效地存储和查询大规模的文本数据。