11

Lucene系列(十)索引格式之pos文件

 3 years ago
source link: http://huyan.couplecoders.tech/lucene/%E6%90%9C%E7%B4%A2/%E7%B4%A2%E5%BC%95%E6%96%87%E4%BB%B6/2021/03/02/lucene%E7%B3%BB%E5%88%97(%E5%8D%81)%E7%B4%A2%E5%BC%95%E6%A0%BC%E5%BC%8F%E4%B9%8Bpos%E6%96%87%E4%BB%B6/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文使用Lucene代码版本: 8.7.0

本文学习一下.pos文件的格式与内容。

pos文件中存储了每个term对应的位置信息. 与doc文件在同一模块进行写入.

因此文件格式与doc总体上讲也是基本相同的,因为不用存储跳跃数据(doc文件中的跳跃数据包含了pos文件的文件位置,可以协助查找),文件反而简单了许多.

.pos文件整体结构

2021-03-11-21-35-57

其中的字段解释:

  • 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的写入:

2021-03-11-21-45-05.

PackedIntBlock写入

org.apache.lucene.codecs.lucene84.Lucene84PostingsWriter#addPosition方法负责在内存中添加每一个文档的位置,负载,偏移量等等信息,在其中如果发现缓存够一个块(128个), 就会调用PForUtil进行一次编码写入:

2021-03-11-21-47-30

Vint写入

每缓冲够一个快(128doc), 就会进行压缩写入,最后必然会剩下一个可能不足128的块, 采用变长Int进行编码,需要注意的是,在pos文件的VIntBlock中,不仅仅写入了位置信息,还同时存储了payload/offset信息。

写入代码位于: org.apache.lucene.codecs.lucene84.Lucene84PostingsWriter#finishTerm.

2021-03-11-21-50-04

比较简单,罗列一下.

最后,欢迎关注我的个人公众号【 呼延十 】,会不定期更新很多后端工程师的学习笔记。 也欢迎直接公众号私信或者邮箱联系我,一定知无不言,言无不尽。 %E6%89%AB%E7%A0%81_%E6%90%9C%E7%B4%A2%E8%81%94%E5%90%88%E4%BC%A0%E6%92%AD%E6%A0%B7%E5%BC%8F-%E6%A0%87%E5%87%86%E8%89%B2%E7%89%88.png

以上皆为个人所思所得,如有错误欢迎评论区指正。

欢迎转载,烦请署名并保留原文链接。

联系邮箱:[email protected]

更多学习笔记见个人博客或关注微信公众号 <呼延十 >——>呼延十



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK