简介
lucene索引的最小单位是段,每当生成一个新的段时(flush,commit,merge,addIndexes等),会生成一个段信息的描述文件,后缀是si。
版本
lucene 9.1.0
涉及的主要类
源码非常简单,就不贴了。主要逻辑在:
org.apache.lucene.codecs.lucene90.Lucene90SegmentInfoFormat
文件结构全局示意图
字段描述
Header
文件头部信息,主要是包括:
- 文件头魔数(同一lucene版本所有文件相同)
- 该文件使用的codec名称:Lucene90SegmentInfo(codec可以理解成文件的布局格式,不同版本lucene相同后缀文件有不一样的版本格式)
- codec版本
- segment后缀名(一般为空)
- segment id(也是Segment_N文件中的N)
SegVersion
生成本segment的lucene版本号。lucene的版本是由三部分组成,用点隔开,major.minor.bugfix,如9.1.0
SegMinVersion
因为segment是可以由多个子segment通过merge重新生成segment,特别是IndexWriter.addIndexes接口,可以添加不同lucene生成的子segment,SemMinVersion记录就是不同版本中的最小版本。
标志位标记了是否存在最小版本,如果所有子segment版本一致,则不需要存储最小版本。0表示不存在最小版本,1表示存在。
SegSize
segment中的文档总数
IsCompoundFile
segment是否使用复合型索引文件格式,则是1,否则是-1。
如果不使用合型索引文件,索引目录最多会生成.fdm、.fdx、.fdt、.tvd、tvx、.liv、.dim、.dii、tim、.tip、.doc、.pos、.pay、nvd、.nvm、.dvm、.dvd、.liv、.si后缀的文件。
使用复合型索引文件,索引目录最多会生成.cfs、.cfe、.liv、.si。
Diagnostics
默认的话会存储以下信息:
-
source
生成segment的来源,主要有三个:
-
flush
-
merge
-
addIndexes
-
-
-
lucene.version:lucene的版本号
-
os:操作系统的名称
-
os.arch:操作系统的架构名称
-
os.version:操作系统的版本
-
java.version:java版本
-
java.vendor:java供应商
-
java.runtime.version:java运行时版本
-
java.vm.version:java虚拟机版本
-
timestamp:生成segment的时间戳
Files
存储属于本segment的所有的文件名。索引文件在加载时会自动删除非法文件,是否非法的判断就是判断文件名是否在某个segment的Files字段中。
Attributes
当前版本中,只会存储一个属性:
Lucene90StoredFieldsFormat.mode,表示正排数据(StoredFields)的存储模式,总共有两种:BEST_SPEED和BEST_COMPRESSION。
IndexSort
IndexSort存储的是segment中文档排序所依赖的字段信息。可以根据多个字段排序,因此NumSortFields记录的是一共有几个字段。SortField记录是详细的排序细节。在当前版本中一共有三种SortField:
SortField
单个值的字段。
-
ProviderName
因为有三种SortField类型,lucene实现根据spi机制获取对应类型,ProviderName存储的就是名称,SortField的名称是SortField。
-
FieldName
字段的名称
-
ValueType
字段的值类型,支持的只有:
-
STRING
-
INT
-
FLOAT
-
LONG
-
DOUBLE
-
-
IsReverse
是否倒序
-
MissingValue
是否有缺失默认值。如果不存在,则写0。存在的话,写1,再写默认值。
注意,string类型的默认值只支持排在最前面(STRING_FIRST)或者最后面(STRING_LAST)。
SortedNumericSortField
多个数值类型的字段。
-
ProviderName:spi的名称,SortedNumericSortField
-
FieldName:字段名称
-
IsReverse:是否倒序
-
Selector:因为是多个值,所以需要选择器提供选择策略获取值来进行排序,目前只有两种:min(最小值)和max(最大值)
-
MissingValue:是否有缺失默认值。如果不存在,则写0。存在的话,写1,再写默认值。
SortedSetSortField
多个字符串类型的字段。
-
ProviderName:spi的名称,SortedSetSortField
-
FieldName:字段名称
-
IsReverse:是否倒序
-
Selector:多值选择器,目前只有四种min(最小值),max(最大值),middle_min(中位数,如果是偶数个,则中位数两个取小的那个),middle_max(中位数,如果是偶数个,则中位数两个取大的那个)
-
MissingValue:缺失默认值,0表示没设置,1表示排在最前面,2表示排在最后面
Footer
文件尾,主要包括
- 文件尾魔数(同一个lucene版本所有文件一样)
- 0
- 校验码