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信息在addDocument()的过程中计算出来,在内存中生成一张倒排表,最终持久化到磁盘时,通过读取倒排表,将position信息写入到.pos文件中,将payload、offset信息写入到.pay文件中。

pay文件的数据结构

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

TermPayload

图2:

PackedPayBlock

PackedPayLengthBlock

这里注意是由于每一个payload的长度无法保证递增,而在使用PackedInts时会用统一大小的字节数来存放每一个payload长度,并且这个字节数取决于payload长度最长的那个。

SumPayLength

PayData

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

TermOffset

图3:

PackedOffsetBlock

PackedOffsetStartDeltaBlock

PackedOffsetLengthBlock

pos文件的数据结构

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

TermPosition

图5:

PackedPosBlock

PackedPosDeltaBlock

VIntBlocks && VIntBlock

PositionDelta

PayloadLength

PayloadData

OffsetDelta

当前position对应的offset的startOffset值,同样是个差值

OffsetLength

当前position对应的offset的endOffset与startOffset的差值。

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

图6:

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

图7:

结语

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

点击下载Markdown文件