有关于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 | 断点 |