Lucene fnm 文件格式詳解

本文及后面關(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)容如下

  1. 3fd7 6c17 固定頭MAGIC
  2. 12 為Lucene60FieldInfos長度18
  3. 18個(gè)字節(jié)Lucene60FieldInfos
  4. 00 0000 02 4個(gè)字節(jié)的Lucene60FieldInfosFormat.FORMAT_CURRENT
  5. 16個(gè)字節(jié)的segmentId, 這個(gè)是隨機(jī)生成的
  6. 00 segment suffix 長度 0

5.2 fnm data 部分

  • 01 代表僅僅只有一個(gè)field, 下面開始寫每一個(gè)field內(nèi)容
  • 05 7469 746c 65 對應(yīng)field長名度5及name titile
  • 00 field 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.format value = Lucene50
    • key = PerFieldPostingsFormat.suffix value = 0
  • 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 e8 MAGIC值,為header值的反碼
  • 00 0000 00 固定4個(gè)字節(jié)int 值為0
  • 0000 0000 136a 0122 8個(gè)字節(jié)的CRC碼

覺得本文有幫助的話,請關(guān)注我的簡書,一同進(jìn)步!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容