本文及后面關(guān)于Lucene的文章所采用的lucene 版本為8.1.0.
1. 什么是fnm文件
fnm文件主要作用是保存field信息, 每一個(gè)doc中有若干field, fnm文件中保存所有的field信息,查詢的時(shí)候根據(jù)此文件恢復(fù)field data 數(shù)據(jù)
2. fnm文件格式

fnm文件格式
3. 測試代碼及結(jié)果
代碼請參考Lucene tim文件格式詳解的第三部分
4. 范例fnm文件內(nèi)容

fnm文件.png
5. fnm文件內(nèi)容分析
5.1 文件頭
文件頭部分主要內(nèi)容為標(biāo)識此文件類型為Lucene60FieldInfos, 源碼部分在Lucene60FieldInfosFormat的271行,主要內(nèi)容如下
-
3fd7 6c17固定頭MAGIC -
12為Lucene60FieldInfos長度18 - 18個(gè)字節(jié)Lucene60FieldInfos
-
00 0000 024個(gè)字節(jié)的Lucene60FieldInfosFormat.FORMAT_CURRENT - 16個(gè)字節(jié)的segmentId, 這個(gè)是隨機(jī)生成的
-
00segment suffix 長度 0
5.2 fnm data 部分
-
01代表僅僅只有一個(gè)field, 下面開始寫每一個(gè)field內(nèi)容 -
05 7469 746c 65對應(yīng)field長名度5及nametitile -
00field number 0 -
00對應(yīng)著field一些元數(shù)據(jù),代碼如下:
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部分, 是一個(gè)Map類型,首先寫Map的size=
02- key =
PerFieldPostingsFormat.formatvalue =Lucene50 - key =
PerFieldPostingsFormat.suffixvalue = 0
- key =
- 00 代表point維度是0,由于寫的Text類型,point維度就是0
以上為一個(gè)field內(nèi)容格式,多個(gè)field時(shí)每一個(gè)field格式內(nèi)容疊加。
5.3 footer區(qū)
footer區(qū)主要有以下內(nèi)容
-
c0 2893 e8MAGIC值,為header值的反碼 -
00 0000 00固定4個(gè)字節(jié)int 值為0 -
0000 0000 136a 01228個(gè)字節(jié)的CRC碼
覺得本文有幫助的話,請關(guān)注我的簡書,一同進(jìn)步!