前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lucene系列(十)索引格式之pos文件

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

作者头像
呼延十
发布2021-03-15 11:09:28
1.3K0
发布2021-03-15 11:09:28
举报
文章被收录于专栏:呼延呼延

本文使用Lucene代码版本: 8.7.0

前言

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

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

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

.pos文件整体结构

2021-03-11-21-35-57
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
2021-03-11-21-45-05

.

PackedIntBlock写入

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

2021-03-11-21-47-30
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
2021-03-11-21-50-04

结语

比较简单,罗列一下.

完。

联系我

最后,欢迎关注我的个人公众号【 呼延十 】,会不定期更新很多后端工程师的学习笔记。 也欢迎直接公众号私信或者邮箱联系我,一定知无不言,言无不尽。

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

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

联系邮箱:huyanshi2580@gmail.com

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • .pos文件整体结构
  • 相关写入代码分析
    • 初始化
      • PackedIntBlock写入
        • Vint写入
        • 结语
        • 联系我
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档