本文使用Lucene代码版本: 8.7.0
前言
本文学习一下.pos文件的格式与内容。
pos文件中存储了每个term对应的位置信息. 与doc文件在同一模块进行写入.
因此文件格式与doc总体上讲也是基本相同的,因为不用存储跳跃数据(doc文件中的跳跃数据包含了pos文件的文件位置,可以协助查找),文件反而简单了许多.
.pos文件整体结构
其中的字段解释:
- IndexHeader: 索引头
- Term: 一个term的位置信息
- Footer: 索引尾.
- PackedIntBlock 一整个块(128个Doc)的位置信息,使用PackedInt进行编码
- VintBlock 最后剩下的不满的一个块的位置信息及payload/offset信息,使用VInt进行编码.
将最后一个不满128的块的payload/offset存储在pos文件而不是理论上应该的pay文件,我猜是为了方便
- posDelta: term在doc中的位置信息,采用增量编码.
- docData: 这是我自己起的名字,是最后一个不满128个doc的块中,一个doc的所有信息,具体包含内容见下方.
- posDelta: term在doc中的位置信息,增量编码》
- payloadLength: payload的长度.
- payloadData: payload具体的字节信息.
- offsetStartDelta: term在doc中的偏移信息,采用增量编码.
- offsetLength: 偏移长度信息.
如果清楚doc文件中如何存储,那么pos文件以及下一篇文章的pay文件就不在话下啦~.
相关写入代码分析
初始化
在org.apache.lucene.codecs.lucene84.Lucene84PostingsWriter#Lucene84PostingsWriter构造方法中, 对该文件进行了初始化及IndexHeader
的写入:
.
PackedIntBlock写入
org.apache.lucene.codecs.lucene84.Lucene84PostingsWriter#addPosition方法负责在内存中添加每一个文档的位置,负载,偏移量等等信息,在其中如果发现缓存够一个块(128个), 就会调用PForUtil
进行一次编码写入:
Vint写入
每缓冲够一个快(128doc), 就会进行压缩写入,最后必然会剩下一个可能不足128的块, 采用变长Int进行编码,需要注意的是,在pos文件的VIntBlock
中,不仅仅写入了位置信息,还同时存储了payload/offset信息。
写入代码位于: org.apache.lucene.codecs.lucene84.Lucene84PostingsWriter#finishTerm
.
结语
比较简单,罗列一下.
完。
联系我
最后,欢迎关注我的个人公众号【 呼延十 】,会不定期更新很多后端工程师的学习笔记。 也欢迎直接公众号私信或者邮箱联系我,一定知无不言,言无不尽。
以上皆为个人所思所得,如有错误欢迎评论区指正。
欢迎转载,烦请署名并保留原文链接。
联系邮箱:huyanshi2580@gmail.com
更多学习笔记见个人博客或关注微信公众号 <呼延十 >——>呼延十