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
文件结构全局示意图
字段描述
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
SegID
每个段都有一个唯一的id
SegCodec
该字段描述了segmentInfo文件编码值,当前版本是是"Lucene90"。
DelGen
liv文件的更新次数,体现在文件名中:
DeletionCount
段中被删除的doc个数
FieldInfosGen
字段信息文件更新的次数,体现在文件名中。不知道怎么情况可以生成。
DocValuesGen
DocValues文件的更新次数,体现在文件名中:
SoftDeletionCount
软删除的文档个数
CommitID
唯一的提交id
FieldInfoFiles
字段信息可能更改,而字段信息文件会有多个版本,字段更改之后会生成新的字段信息文件,由此字段存储字段关联的最新的字段信息文件名。
DocValuesUpatesFiles
DocValues可能更改,而DocValues文件会有多个版本,DocValues更改之后会生成新DocValues文件,由此字段存储字段关联的最新的字段信息文件名。
UserData
类似git的commit信息,可以通过IndexWriter.setLiveCommitData,这样每一次commit就带了用户的信息。
Footer
文件尾,主要包括
- 文件尾魔数(同一个lucene版本所有文件一样)
- 0
- 校验码