索引文件之si
Lu Xugang Lv6

  当生成一个新的segment时(执行flush、commit、merge、addIndexes(facet)),会生成一个描述段文件信息(segmentInfo)的.si索引文件。

si文件的数据结构

图1:

SegVersion

  SegVersion描述了该segment的版本信息。

图2:

Created.major、Created.minor、Created.bugfix

  Created描述的是segment创建版本。major、minor、bugfix三者组成了一个版本号,比如本文介绍的就是Lucene7.5.0版本,所以major = 7、minor = 5、bugfix = 0。

标志位

  在读取.si文件时的读取该标志位,如果该值为1,表示.si文件中带有Min.major、Min.minor、Min.bugfix的信息需要读取,否则标志位的值为0。

Min.major、Min.minor、Min.bugfix

  上文中提到生成一个新的segment可能由flush、commit、merge、addIndexes(facet)触发,那么当merge触发时,意味着多个segment会合并为一个新的segment,那么将某个最小创建版本的segment作为Min.major、Min.minor、Min.bugfix,可以用来判断是否兼容该最小版本的索引文件。

SegSize

  该字段描述了segment中的文档(Document)个数。

IsCompoundFile

  该字段描述了segment对应的索引文件是否使用组合文件,在索引文件中生成不同的文件

  不使用组合文件会生成.fdx、.fdt.tvd、tvx.liv.dim、.diitim、.tip.doc.pos、.paynvd、.nvm.dvm、,dvd

图3:

  使用组合文件:

图4:

Diagnostics

  该字段描述了以下信息:

  • os:运行Lucene所在的操作系统,版本号,架构,比如操作系统为Mac OS X,版本号为10.14.3,架构为x86_64
  • java:java的发行商,版本号,JVM的版本号
  • version:Lucene的版本号,比如7.5.0
  • source:生成当前segment是由什么触发的,flush、commit、merge、addIndexes(facet)
  • timestamp:生成当前segment的时间戳

Files

  该字段描述了segment对应的索引文件的名字,索引文件即图3或者图4。

Attributes

  该字段描述了记录存储域的索引文件,即.fdx、.fdt使用的索引模式,索引模式有两种: BEST_SPEED 或 BEST_COMPRESSION,Attributes记录其索引模式的名称。

IndexSort

  该字段用来对segment内的文档进行排序(用法见Collector(三)中的预备知识文档提交之flush(三)中的sortMap),该值在IndexWriterConfig对象中设置排序规则,可以提供多个Sort对象。

图5:

NumSortFields

  该字段描述了排序规则的个数。

FieldName

  SortField的域名。

SortTypeID

  在前面的文章中介绍了FieldComparator,它同IndexSort一样使用Sort对象来实现排序,而IndexSort中的排序类型(SortField的域值类型)只是FieldComparator中的部分排序类型,每一种排序类型对应一个SortTypeID:

  • 0:STRING
  • 1:LONG
  • 2:INT
  • 3:DOUBLE
  • 4:FLOAT
  • 5:SortedSetSortField
  • 6:SortedNumericSortField

Selector

  只有SortTypeID = 5时才会有该字段,因为SortedSetSortField允许有多个域值(String类型),我们必须确定其中一个域值来排序,Selector的值可以有以下几种:

  • 0:取最小域值
  • 1:取最大域值
  • 2:取中间的域值,如果域值个数为偶数个,那么中间的域值就有两个,取较小值,比如有4个域值,“a”,“c”,“d”,“e”,中间域值为"c",, “d”,那么取"c"
  • 3:取中间的域值,如果域值个数为偶数个,那么中间的域值就有两个,取较大值

NumericType、Selector

  只有SortTypeID = 6时才会有该字段,因为SortedNumericSortField域值类型NumericType有多个,我们确定域值类型NumericType:

  • 0:LONG
  • 1:INT
  • 2:DOUBLE
  • 3:FLOAT

  另外因为SortedNumericSortField域值个数可以是多个,所以我们必须确定其中一个域值来排序,Selector的值可以有以下几种:

  • 0:取最小域值
  • 1:取最大域值

Reverse

  该字段为0表示正序,1位倒序。

缺失值标志位

  如果有些文档没有排序规则,即需要给该文档添加一个缺失值,那么标志位为1,为0则不添加缺失值。

缺失值

  当缺失值标志位为1,那么需要记录缺失值。这里需要特别说明的是,如果域值是String类型,那么它的缺失值只能是固定的 “SortField.STRING_LAST"或者"SortField.STRING_FIRST”,表示没有排序规则的文档要么在序列最后面,要么在序列最前面,其他域值类型需要提供一个明确的缺失值。

si文件总数据结构

图6:

点击下载Markdown文件

 Comments