Lucene 段文件(segment, si)格式分析

2019-07-22  本文已影响0人  ni_d58f

以下均是基于lucene 8.1.0

1. 文件格式

段元数据

解释:

  1. 1到8节是一个整型CODEC_MAGIC数值为: 0x3f d7 6c 17
  2. 接下来0x08是一个退格, 看代码其实没有这个,但不知为啥有这个
  3. 接下来为'segment' 这个都是可见字符,如右图
  4. 接下来是一个版本号,可以知道版本号为0x00 00 00 09, 即9, 目前来说要求该版本号在VERSION_70(7)到VERSION_74(9)之间
  5. 接着是16字节的id字段,即 0x88 b000 65f0 baed e64b feb6 9c0b 9f3c 98
  6. 接着是一个字节的IndexHeaderSuffix, 值为0x01, 即1
  7. 然后读取7的IndexHeaderSuffix字节数,即 0x33, 对应数据3, 即后缀为3
  8. 接下来读取3个变长的int数, 即 0x08, 0x01, 0x00 即8、1、0, 代表lucene主版本号、次版本号、bugfix版本号
  9. 接下来读取一个可变Int的 indexCreatedVersion, 如图会读取到0x08, 即8
  10. 接下来会读取一个8字节的Long值,该值代码SegmentInfos的版本号,这个版本号代表着index 被修改了多少次, 如图会读到0x0000 0000 0000 000a 即10
  11. 如果在步中读到的值 大于 VERSION_70(7)的话,即接下读一个可变long值, 否则的话一个int值,由于是基于lucene 8测试,此时肯定读一个long, 即0x03 即3, 这个counter用于命名新的segments
  12. 接下来读一个int的 segments数量,读到00 00 00 03即3
  13. 接下下读3个可变int, 类似于9中, 用于指名segmentInfors的minSegmentLuceneVersion的值, 如图,会依次读到0x08, 0x01, 0x00, 即8,1,0 对应lucene 版本为 8.1.0
  14. 现在开始一次读取这三个段的内容, 此部分以一个循环的行为读取
段信息

再次读Map,首先读取map的size = 0x01, 接着

key length key(0x) key(char) value length value(0x) value(char)
0x1f 0x 4c 7563 656e 6535 3053 746f 7265 6446 6965 6c64 7346 6f72 6d61 742e 6d6f 6465 Lucene50StoredFieldsFormat.mode 0a 0x4553 545f 5350 4545 44 BEST_SPEED

后续: 读一个可变Int 以作为 numSortFields, 如图会读到0x00, 如果此值不为0, 会对这一字段做进一步解析()。 后面会是文件尾。文件尾长度为16个字节, 依次为 尾Magic, 值为CODEC_MAGIC的反码(0xc028 93e8) 接着会读一个int的algorithmID0x0000 0000 。 接下来会读一个long类型的checksum 0x0000 0000 e440 e97d 最后会剩下一个0x0a

回到segment_3文件。

接下来会依次读:
一个Long的delGen, 值0x ff ffff ffff ffff ff, 再读一个Int的delCount,值为0x00 0000 00
一个Long的fieldInfosGen 值为0xff ffff ffff ffff ff. 一个Long的 dvGen 值为0x ff ffff ffff ffff ff
一个Int的 softDelCount, 值为00 0000 00
后会就是文件尾,和_0.si文件格式一致,请参考此块文件内容。

上一篇下一篇

猜你喜欢

热点阅读