pos&&pay文件

  position在Lucene中描述的是一个term在一篇文档中的位置,并且存在一个或多个position。

  payload是一个自定义的元数据(mete data)来描述term的某个属性,term在一篇文章中的多个位置可以一一对应多个payload,也可以只有部分位置带有payload。

  offset是一对整数值(a pair of integers),即startOffset跟endOffset,它们分别描述了term的第一个字符跟最后一个在文档中的位置。

  每一个term在所有文档中的position、payload、offset信息在IndexWriter.addDocument()的过程中计算出来,在内存中生成一张倒排表,最终持久化到磁盘时,通过读取倒排表,将position信息写入到.pos文件中,将payload、offset信息写入到.pay文件中。

  本文介绍的是索引文件.pos、.pay的数据结构,其生成过程见文章索引文件的生成(二)

pay文件的数据结构

图1:

  在.pay文件中,TermPayload、TermOffset分别记录一个term的payload、offset信息。

TermPayload

图2:

PackedPayBlock

PackedPayLengthBlock

这里注意是由于每一个payload的长度无法保证递增,只能使用PackedInts存储原始数据。

SumPayLength

PayData

  注意的是,payload的真实数据没有使用压缩存储。

TermOffset

图3:

PackedOffsetBlock

PackedOffsetStartDeltaBlock

PackedOffsetLengthBlock

pos文件的数据结构

图4:

  在.pos文件中,TermPosition记录一个term的position信息。

TermPosition

图5:

PackedPosBlock

PackedPosDeltaBlock

VIntBlocks && VIntBlock

PositionDelta

PayloadLength

PayloadData

OffsetDelta

OffsetLength

多个域的pay文件的数据结构

图6:

多个域的pos文件的数据结构

图7:

结语

  .pos、.pay、.doc、.tim、.tip文件都是在flush()阶段通过读取倒排表一起生成的,另外.doc跟.pos、.pay文件还有映射关系,在后面介绍.doc文件时候会涉及。

点击下载Markdown文件