当生成一个新的segment时(执行flush、commit、merge、addIndexes(facet)),会生成一个描述段文件信息(segmentInfo)的.si索引文件。
图1:
SegVersion描述了该segment的版本信息。
图2:
Created描述的是segment创建版本。major、minor、bugfix三者组成了一个版本号,比如本文介绍的就是Lucene7.5.0版本,所以major = 7、minor = 5、bugfix = 0。
在读取.si文件时的读取该标志位,如果该值为1,表示.si文件中带有Min.major、Min.minor、Min.bugfix的信息需要读取,否则标志位的值为0。
上文中提到生成一个新的segment可能由flush、commit、merge、addIndexes(facet)触发,那么当merge触发时,意味着多个segment会合并为一个新的segment,那么将某个最小创建版本的segment作为Min.major、Min.minor、Min.bugfix,可以用来判断是否兼容该最小版本的索引文件。
该字段描述了segment中的文档(Document)个数。
该字段描述了segment对应的索引文件是否使用组合文件,在索引文件中生成不同的文件
不使用组合文件会生成.fdx、.fdt、.tvd、tvx、.liv、.dim、.dii、tim、.tip、.doc、.pos、.pay、nvd、.nvm、.dvm、,dvd:
图3:
使用组合文件:
图4:
该字段描述了以下信息:
该字段描述了segment对应的索引文件的名字,索引文件即图3或者图4。
该字段描述了记录存储域的索引文件,即.fdx、.fdt使用的索引模式,索引模式有两种: BEST_SPEED 或 BEST_COMPRESSION,Attributes记录其索引模式的名称,两者的区别在 两阶段生成索引文件之第一阶段 已经介绍,不赘述。
该字段用来对segment内的文档进行排序(用法见Collector(三)中的预备知识及文档提交之flush(三)中的sortMap),该值在IndexWriterConfig对象中设置排序规则,可以提供多个Sort对象。该字段会影响文档信息写入索引文件的信息,顺便提一下的是,如果设置了IndexSort后,在 两阶段生成索引文件之第一阶段就只会生成一个临时文件的.fdx、.fdx、.tvd、.tvx文件。
图5:
该字段描述了排序规则的个数。
SortField的域名。
在前面的文章中介绍了FieldComparator,它同IndexSort一样使用Sort对象来实现排序,而IndexSort中的排序类型(SortField的域值类型)只是FieldComparator中的部分排序类型,每一种排序类型对应一个SortTypeID:
只有SortTypeID = 5时才会有该字段,因为SortedSetSortField允许有多个域值(String类型),我们必须确定其中一个域值来排序,Selector的值可以有以下几种:
只有SortTypeID = 6时才会有该字段,因为SortedNumericSortField域值类型NumericType有多个,我们确定域值类型NumericType:
另外因为SortedNumericSortField域值个数可以是多个,所以我们必须确定其中一个域值来排序,Selector的值可以有以下几种:
该字段为0表示正序,1位倒序。
如果有些文档没有排序规则,即需要给该文档添加一个缺失值,那么标志位为1,为0则不添加缺失值。
当缺失值标志位为1,那么需要记录缺失值。这里需要特别说明的是,如果域值是String类型,那么它的缺失值只能是固定的 "SortField.STRING_LAST"或者"SortField.STRING_FIRST",表示没有排序规则的文档要么在序列最后面,要么在序列最前面,其他域值类型需要提供一个明确的缺失值。
图6:
点击下载Markdown文件