Lucene源码系列(三十):segments_N索引文件格式

636 阅读2分钟

segments_N文件

简介

在调用IndexWriter.commit方法后,索引目录会生成segments_N一个文件,用来描述当前索引目录中所有有效的段的信息,也就是si文件。持久化的索引必须通过commit生成segments_N,仅仅通过IndexWriter.flush生成的段信息,重新加载索引,无效的段信息文件都会被自动删除。

虽然每次调用commit都会在索引目录中生成一个segments_N文件,但是索引目录中具体可以存在多少个segments_N文件,是由IndexDeletionPolicy决定的,该配置在IndexWriterConfig中设置。默认是使用KeepOnlyLastCommitDeletionPolicy,看名字也知道只保留最新的一次commit产生的segments_N文件。

版本

lucene 9.1.0

源码逻辑

比较简单,位置在:

org.apache.lucene.index.SegmentInfos#write

文件结构全局示意图

SegmentN文件结构.png

字段描述

Header

文件头部信息,主要是包括:

  • 文件头魔数(同一lucene版本所有文件相同)
  • 该文件使用的codec名称:segments(codec可以理解成文件的布局格式,不同版本lucene相同后缀文件有不一样的版本格式)
  • codec版本
  • segment后缀名(一般为空)
  • segment id(也是Segment_N文件中的N)

LuceneVersion

当前使用的lucene版本,版本号还是三段式:major.minor.bugfix

IndexCreatedVersionMajor

创建该segments_N文件的lucene的版本号的major值,好像跟LuceneVersion字段冗余,不知道为什么。

Version

SegmentInfos对象被修改的次数,也就是整个索引被修改的次数

NameCounter

segment名称,新生成的segment的名称是 _NameCounter组成的前缀

SegCount

索引文件中有效的段的个数

MinSegmentLuceneVersion

存储的是所有segment中的最小的version

SegmentCommitInfo

索引文件中的每一个有效段都对应了一个SegmentCommitInfo。

SegName

段文件的名称前缀。如图中有两个段,段文件的前缀分别是_0和_1,这就是SegName

image-20220221164553635.png

SegID

每个段都有一个唯一的id

SegCodec

该字段描述了segmentInfo文件编码值,当前版本是是"Lucene90"。

DelGen

liv文件的更新次数,体现在文件名中:

image-20220221170723413.png

DeletionCount

段中被删除的doc个数

FieldInfosGen

字段信息文件更新的次数,体现在文件名中。不知道怎么情况可以生成。

DocValuesGen

DocValues文件的更新次数,体现在文件名中:

image-20220221170651244.png

SoftDeletionCount

软删除的文档个数

CommitID

唯一的提交id

FieldInfoFiles

字段信息可能更改,而字段信息文件会有多个版本,字段更改之后会生成新的字段信息文件,由此字段存储字段关联的最新的字段信息文件名。

DocValuesUpatesFiles

DocValues可能更改,而DocValues文件会有多个版本,DocValues更改之后会生成新DocValues文件,由此字段存储字段关联的最新的字段信息文件名。

UserData

类似git的commit信息,可以通过IndexWriter.setLiveCommitData,这样每一次commit就带了用户的信息。

Footer

文件尾,主要包括

  • 文件尾魔数(同一个lucene版本所有文件一样)
  • 0
  • 校验码