Lucene 三: Lucene 的索引文件格式
内容提要
Lucene索引采用层次结构:索引包含多个段,段包含文档,文档包含域,域包含词。索引文件分为正向信息(segments_N、fnm、fdx/fdt、tvx/tvd/tvf)和反向信息(词典tis/tii、倒排表frq、位置prx)。为节省空间,使用前缀后缀、差值、或然跟随和跳跃表等规则。基本数据类型包括Byte、UInt32、VInt、String等。
延伸解读
索引文件格式:理解Lucene的钥匙
文章开篇指出,Lucene的索引文件格式是读懂源代码的关键。索引过程实质是将倒排表按特定格式写入文件,搜索过程则是按此格式读出信息并计算文档得分。因此,掌握文件格式有助于深入理解Lucene的索引与搜索机制,为后续源码分析打下基础。
正向信息与反向信息:索引的双重结构
Lucene索引同时保存正向和反向信息。正向信息按索引→段→文档→域→词的层次记录包含关系,相关文件包括segments_N、fnm、fdx/fdt、tvx/tvd/tvf。反向信息则保存词到文档的映射,即词典和倒排表,涉及tis/tii、frq、prx文件。两者共同支撑检索功能。
空间优化技巧:前缀后缀、差值与或然跟随
为节省空间,Lucene采用多种编码规则。前缀后缀规则利用词典中词的有序性,只存储与前词共同前缀的偏移和后缀;差值规则对递增的文档号或位置只存增量;或然跟随规则用一位标志表示后续值是否存在。这些技巧显著减小索引体积,但阅读格式时需留意其特殊处理。
跳跃表:加速查找的数据结构
跳跃表是Lucene提高查找性能的重要结构,应用于倒排表和词典索引。它通过多层链表和固定间隔的跳跃节点,减少查找时的访问次数。文章以查找元素72为例,说明跳跃表能将访问元素数从10个减少到3个。但需注意,Lucene实现中跳跃节点的保存位置与理论描述存在偏移。
Q&A
Lucene索引的层次结构是怎样的?
Lucene索引采用层次结构:索引(Index)包含多个段(Segment),段包含文档(Document),文档包含域(Field),域包含词(Term)。
Lucene索引中正向信息和反向信息分别指什么?
正向信息按层次保存从索引到词的包含关系:索引→段→文档→域→词,相关文件有segments_N、fnm、fdx/fdt、tvx/tvd/tvf。反向信息保存词典到倒排表的映射:词→文档,相关文件有tis/tii、frq、prx。
Lucene索引文件使用了哪些节省空间的规则?
Lucene使用了四种规则:前缀后缀规则(Prefix+Suffix)用于词典存储;差值规则(Delta)用于整数存储;或然跟随规则(A, B?)用于可选值;跳跃表规则(Skip list)用于提高查找性能。
Lucene索引中的基本数据类型有哪些?
基本数据类型包括:Byte(8位)、UInt32(4字节)、UInt64(8字节)、VInt(变长整数)、Chars(UTF-8编码的字节序列)、String(VInt长度+UTF-8字符序列)。
Lucene的段元数据文件segments_N包含哪些信息?
segments_N包含:Format(版本号)、Version(索引版本号)、NameCount(下一个新段名)、SegCount(段个数)、每个段的元数据(SegName、SegSize、DelGen、DocStoreOffset等)、HasSingleNormFile、NumField、NormGen、IsCompoundFile、DeletionCount、HasProx、Diagnostics、User map data、CheckSum。
Lucene中标准化因子(nrm)的作用是什么?
标准化因子用于调整Term Weight计算,减少文档重要性、域重要性、文档长度对打分的影响。计算包括Document boost、Field boost和lengthNorm(field) = 1/sqrt(numTerms)。