Lucene源码系列(二十八):si索引文件格式

914 阅读3分钟

简介

lucene索引的最小单位是段,每当生成一个新的段时(flush,commit,merge,addIndexes等),会生成一个段信息的描述文件,后缀是si。

版本

lucene 9.1.0

涉及的主要类

源码非常简单,就不贴了。主要逻辑在:

org.apache.lucene.codecs.lucene90.Lucene90SegmentInfoFormat

文件结构全局示意图

si文件结构.png

字段描述

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后缀的文件。

image-20220221170556366.png

使用复合型索引文件,索引目录最多会生成.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

单个值的字段。

image-20220221151745976.png

  • ProviderName

    因为有三种SortField类型,lucene实现根据spi机制获取对应类型,ProviderName存储的就是名称,SortField的名称是SortField。

  • FieldName

    字段的名称

  • ValueType

    字段的值类型,支持的只有:

    • STRING

    • INT

    • FLOAT

    • LONG

    • DOUBLE

  • IsReverse

    是否倒序

  • MissingValue

    是否有缺失默认值。如果不存在,则写0。存在的话,写1,再写默认值。

    注意,string类型的默认值只支持排在最前面(STRING_FIRST)或者最后面(STRING_LAST)。

SortedNumericSortField

多个数值类型的字段。

image-20220221152710495.png

  • ProviderName:spi的名称,SortedNumericSortField

  • FieldName:字段名称

  • IsReverse:是否倒序

  • Selector:因为是多个值,所以需要选择器提供选择策略获取值来进行排序,目前只有两种:min(最小值)和max(最大值)

  • MissingValue:是否有缺失默认值。如果不存在,则写0。存在的话,写1,再写默认值。

SortedSetSortField

多个字符串类型的字段。

image-20220221153111312.png

  • ProviderName:spi的名称,SortedSetSortField

  • FieldName:字段名称

  • IsReverse:是否倒序

  • Selector:多值选择器,目前只有四种min(最小值),max(最大值),middle_min(中位数,如果是偶数个,则中位数两个取小的那个),middle_max(中位数,如果是偶数个,则中位数两个取大的那个)

  • MissingValue:缺失默认值,0表示没设置,1表示排在最前面,2表示排在最后面

Footer

文件尾,主要包括

  • 文件尾魔数(同一个lucene版本所有文件一样)
  • 0
  • 校验码