Lucene fnm 文件格式详解

本文及后面关于Lucene的文章所采用的lucene 版本为8.1.0.

1. 什么是fnm文件

fnm文件主要作用是保存field信息, 每一个doc中有若干field, fnm文件中保存所有的field信息,查询的时候根据此文件恢复field data 数据


2. fnm文件格式

fnm文件格式

3. 测试代码及结果

代码请参考Lucene tim文件格式详解的第三部分


4. 范例fnm文件内容

fnm文件.png

5. fnm文件内容分析

5.1 文件头

文件头部分主要内容为标识此文件类型为Lucene60FieldInfos, 源码部分在Lucene60FieldInfosFormat的271行,主要内容如下

  1. 3fd7 6c17 固定头MAGIC
  2. 12 为Lucene60FieldInfos长度18
  3. 18个字节Lucene60FieldInfos
  4. 00 0000 02 4个字节的Lucene60FieldInfosFormat.FORMAT_CURRENT
  5. 16个字节的segmentId, 这个是随机生成的
  6. 00 segment suffix 长度 0

5.2 fnm data 部分

  • 01 代表仅仅只有一个field, 下面开始写每一个field内容
  • 05 7469 746c 65 对应field长名度5及name titile
  • 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
  • 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码

觉得本文有帮助的话,请关注我的,一同进步!

你可能感兴趣的:(Lucene fnm 文件格式详解)