本文及后面关于Lucene的文章所采用的lucene 版本为8.1.0.
1. 什么是pos文件
pos
文件主要作用是保存term的在text/string field的position信息,假如有一个doc的textField内容为
this is a text
, 那么通过分词后,text
的pos可能为3,之所以说可能是因为不同的分词器可能会造成pos的值不同
2. pos文件格式
3. 测试代码及结果
代码请参考Lucene tim文件格式详解的第三部分
4. 范例pos文件内容
5. pos文件内容分析
5.1 文件头
文件头部分主要内容为标识此文件类型为Lucene50PostingsWriterPos
, 源码部分在Lucene50PostingsWriter
的123行,主要内容如下
-
3fd7 6c17
固定头MAGIC -
19
为Lucene50PostingsWriterPos长度25 -
4c 7563 656e 6535 3050 6f73 7469 6e67 7357 7269 7465 7250 6f73
25个字节即Lucene50PostingsWriterPos -
00 0000 01
4个字节的BlockTreeTermsReader.VERSION_CURRENT
-
033b 7304 9c42 d68a 8e00 484b 6c7f b50b
16个字节的segmentId, 这个是随机生成的 -
0a
segment suffix 长度 10 -
4c75 6365 6e65 3530 5f30
10个字节的segment suffix内容即Lucene50_0
5.2 term pos data 部分
开始本部分阅读时,请注意一个在第3部分得到的结果及含义, 现在开始分析该部分内容
-
01
对应 haha在doc1中的position 1 -
02
对应 hello在doc0中的position 2 -
00
对应lucene在doc0中的position 0 -
04
对应nice在doc0中的position 4 -
01
对应nice在doc0中的position 5. 此处采用delta编码,一个term 在同一个doc的position采用delta编码,nice在doc0的postion为4、5. 首先将第一次出现的position值写入pos文件,接下的position值以第一次的值的delta值形式写入pos文件, 1 = 5 - 4 -
00
对应nice在doc1中的position 0 -
01
对应test在doc0的position 1 -
03
对应word在doc0在position 3
以上为一个field内容格式,多个field时每一个field格式内容叠加。
5.3 footer区
footer区主要有以下内容
-
c0 2893 e8
MAGIC值,为header值的反码 -
00 0000 00
固定4个字节int 值为0 -
00 0000 0048 3d80 09
8个字节的CRC码
觉得本文有帮助的话,请关注我的简书,一同进步!