本文及后面关于Lucene的文章所采用的lucene 版本为8.1.0.
1. 什么是fnm文件
fnm
文件主要作用是保存field信息, 每一个doc中有若干field, fnm文件中保存所有的field信息,查询的时候根据此文件恢复field data 数据
2. fnm文件格式
3. 测试代码及结果
代码请参考Lucene tim文件格式详解的第三部分
4. 范例fnm文件内容
5. fnm文件内容分析
5.1 文件头
文件头部分主要内容为标识此文件类型为Lucene60FieldInfos
, 源码部分在Lucene60FieldInfosFormat
的271行,主要内容如下
-
3fd7 6c17
固定头MAGIC -
12
为Lucene60FieldInfos长度18 - 18个字节Lucene60FieldInfos
-
00 0000 02
4个字节的Lucene60FieldInfosFormat.FORMAT_CURRENT
- 16个字节的segmentId, 这个是随机生成的
-
00
segment suffix 长度 0
5.2 fnm data 部分
-
01
代表仅仅只有一个field, 下面开始写每一个field内容 -
05 7469 746c 65
对应field长名度5及nametitile
-
00
field number 0 -
00
对应着field一些元数据,代码如下:
byte bits = 0x0;
if (fi.hasVectors()) bits |= STORE_TERMVECTOR;
if (fi.omitsNorms()) bits |= OMIT_NORMS;
if (fi.hasPayloads()) bits |= STORE_PAYLOADS;
if (fi.isSoftDeletesField()) bits |= SOFT_DELETES_FIELD;
output.writeByte(bits);
-
03
代表着index option为DOCS_AND_FREQS_AND_POSITIONS
-
00
代表着doc values 类型为DocValuesType.NONE -
ff ffff ffff ffff ff
-1 DocValuesGen - 接下来是field的attributes部分, 是一个Map类型,首先写Map的size=
02
- key =
PerFieldPostingsFormat.format
value =Lucene50
- key =
PerFieldPostingsFormat.suffix
value = 0
- key =
- 00 代表point维度是0,由于写的Text类型,point维度就是0
以上为一个field内容格式,多个field时每一个field格式内容叠加。
5.3 footer区
footer区主要有以下内容
-
c0 2893 e8
MAGIC值,为header值的反码 -
00 0000 00
固定4个字节int 值为0 -
0000 0000 136a 0122
8个字节的CRC码
觉得本文有帮助的话,请关注我的简书,一同进步!