当IndexWriter执行commit()操作后,会生成一个segments_N文件,该文件描述了当前索引目录中所有有效的段信息文件(active segment info),即之前文章介绍的segmentInfo文件。
索引目录中可能存在多个Segments_N文件,每个Segment_N文件代表某次commit()时的索引状态,其中N值最大的Segments_N文件代表最新的一次提交,它包含当前索引目录中所有的索引信息。
图1中最新的一次提交生成了Segments_5文件。
图1:
图1中Segments_N文件包含的索引信息关系如下图:
图2:
一个索引目录中存在多个segments_N文件的原因大体分为两点:
- 旧的segments_N暂时不能被删除:原因很多,在后面介绍IndexWriter的文章中会提及
- 使用了非默认的IndexDeletionPolicy:IndexDeletionPolicy提供了一个策略,该策略描述了当一个新的commit()提交后,如果处理旧的提交,Lucene7.5.0中默认使用的是KeepOnlyLastCommitDeletionPolicy,它是IndexDeletionPolicy的其中一个实现,即当有新的提交时,删除前面的提交,比如在图1中,就只会保留segments_5文件;例如同样作为IndexDeletionPolicy的另一个实现,NoDeletionPolicy,使用该策略就会保留每次的commit(),这么做的好处就相当于设置了每一个commit()检查点,配合CommitUserData(下文会介绍),我们可以将索引信息恢复到任意一个检查点,缺点是很明显的,如图2中,每一个segments_N都包含了以往所有的信息,索引目录的大小因此会很大。
看这里:https://www.amazingkoala.com.cn/Lucene/suoyinwenjian/2019/0610/65.html