有关于Lucene索引的实现都可以在org.apache.lucene.codecs.lucene60找到,该包中核心类主要包含:

  • Lucene60Codec ,实现Lucene 6.0索引格式,包含可配置的字段倒排链和Docvalues格式
  • Lucene60FieldInfosFormat,Lucene 6.0 Field Infos格式
  • Lucene60PointsFormat,Lucene 6.0 point格式,将维度值通过KD树构建

概念

Lucene的基本概念有index、document、field、term,index中包含一系列的documents:

  • 一个document包含很多fields
  • field由terms序列组成
  • term就是一个字节序列

倒排索引

索引存储有关Term的统计信息,以便提高Term的查询效率。Luene的索引属于倒排索引范畴,倒排索引链上会列出包含该term的所有文档。

Field类型

Field在索引中有两种形式:

  • stored,将文本信息直接存储索引中,而不是倒排索引的方式
  • indexed,以倒排的形式存在索引中
    text形式的field,既可以通过分词成terms存在于索引中,也可以部分词作为一个term存在索引中,但是通常我们都会选择分词。

Segments

Lucene的索引由多个子索引或者segments组成,每个segment是一个独立的索引,可以被独立搜索。
在索引中,segment有几种生成方式:

  • 添加新的documents生成了新的segments
  • 合并现有segments
    搜索可能涉及多个段和/或多个索引,每个索引可能由一组段组成。

Document Numbers

Lucene通过一个整型的文档号指向文档,添加至索引中的第一个文档的编号为0,每个后续添加的文档都会得到一个比前一个文档大的数字。
在使用文档编号时,有一些注意事项:

  • 每个段中存储的数字仅在段内是惟一的,必须进行转换才能在全局的上下文中使用。可以通过文档的段内编号加上段的基编号得到文档的全局编号。
  • 文档删除时,文档编号会产生间隙,当索引合并时,那些删除的文档才会被真正的删除,文档编号的间隙才会被消除。

索引结构概述

每个索引段包含如下内容:

  • 段信息,它包含有关段的元数据,例如文档数
  • 字段名,包含索引中使用的字段名称集
  • 设置为Stored的字段值
  • Term dictionary,包含所有文档的所有索引字段中term的字典。字典还记录包含该term的文档数量
  • Term Frequency 数据,存储Term词典中某个term在某个document出现的次数,除非设置了IndexOptions.DOCS_ONLY,即忽略频率
  • Term Proximity 数据,记录term在指定文档中的位置信息
  • Normalization factors,对于文档中的每个字段,存储一个标准化的因子,用于匹配打分时,乘以该字段上的匹配分值。
  • Term Vectors,对于每个文档中的每个字段,可以存储Term Vectors,Term Vectors由Term文本和Term频率组成。
  • Docvalue,即正向索引
  • 存活文档,可选文件,指示哪些文档是活动的
  • Point values,可选的一组文件,记录维度索引字段,支持快速的数值范围过滤和BigInteger、BigDecimal (1D)、地理形状(2D、3D)这类大数值的交集运算

索引文件名

同一个段中的所有文件,具有相同的名称,唯独扩展名不同。
使用复合文件格式时(1.4或更高版本中默认值),这些文件(段信息文件、锁文件和已删除文档文件除外)被折叠成一个.cfs文件.
从2.1版(无锁提交)开始,文件名就不再被重用。也就是说,当任何文件被保存到目录中时,都会给它一个从未使用过的文件名。这是通过使用简单的生成方法实现的。例如,第一个段文件是segments_1,然后是segments_2,等等,生成方式为字母+数字。
下面总结了Lucene中文件的名称和扩展名:

名称 扩展名 简要介绍
Segments File segments_N 存储有关提交点的信息
Lock File write.lock 防止多个IndexWriters写入同一文件.
Segment Info .si 存储有关段的元数据
Compound File .cfs, .cfe 一个可选的“虚拟”文件,由多个索引文件组成,用于避免过多句柄打开.
Fields .fnm 存储有关字段的信息
Field Index .fdx 包含指向字段数据的指针
Field Data .fdt 存储的文档字段
Term Dictionary .tim Term词典,存储Term信息
Term Index .tip Term词典的索引
Frequencies .doc 存储每个Term的文档链,以及Term在该文档上的频率
Positions .pos 存储有关Term在索引中出现位置信息
Payloads .pay 存储每个位置额外的元数据信息,如payloads信息
Norms .nvd, .nvm 文档和字段长度以及权重因子
Docvalues .dvd, .dvm 额外打分因子或其他每个文档的信息.
Term Vector Index .tvx Term Vector索引
Term Vector Documents .tvd Term Vector文档级别的信息
Term Vector Fields .tvf Term Vector字段级别的信息
Live Documents .liv 那些文件是活动的
Point values .dii, .dim 断点