Apache Lucene - 索引文件格式
介绍
本文档定义了此版本(4.10.4)Lucene中使用的索引文件格式,如果您使用的是不同版本的Lucene,请查阅和您使用的版本一起发布的docs
文档。
Apache Lucene是用Java编写的,但是正在做一些努力来用其他编程语言中编写Lucene版本。如果这些版本要与Apache Lucene保持兼容,则需要一个与语言无关的Lucene索引格式定义。因此,本文档试图提供Apache Lucene文件格式的完整且独立的定义。
随着Lucene的发展,这份文件应该不断发展。Lucene在不同编程语言中的版本应努力就文件格式达成一致,并生成本文档的新版本。
定义
Lucene的基本概念是索引,文档(document),字段(field)和词(term)
索引包含一系列文档
- 文档是一系列字段
- 字段是命名的词序列
- 词是一个字节序列
两个不同字段中的相同字节序列被认为是不同的词。因此,词表示为一对:命名字段的字符串和字段中的字节。
倒排索引
该索引存储有关词的统计信息,以使基于词的搜索更有效。Lucene的索引属于被称为倒排索引的索引家族。这是因为它可以列出包含它的文档,这是自然关系的反转,其中文档列出词。
字段类型
在Lucene中,字段可以被存储,在这种情况下,它们的文本以字面方式以非反转的方式存储在索引中。被反转的字段称为索引,一个字段既可以存储也可以被索引。
字段的文本可以被tokenized为要索引的词,或者字段的文本可以逐字地用作要索引的词。大多数字段都是标记化的,但有时某些标识符字段的字面索引很有用。
有关 Fields的更多信息,请参阅Field
java文档。
Segments
段
Lucene索引可以由多个子索引或段组成。每个段都是完全独立的索引,可以单独搜索。索引演变为:
为新添加的文档创建新段
合并现有段
搜索可能涉及多个段和/或多个索引,每个索引可能由一组段组成。
文件编号
在内部,Lucene通过整数——文档编号引用文档。添加到索引的第一个文档编号为零,并且添加的每个后续文档都比前一个更大。
请注意,文档的编号可能会更改,因此在将这些编号存储在Lucene之外时应小心。特别是,在以下情况下,数字可能会发生变化:
存储在每个段中的数字仅在段内是唯一的,并且必须先进行转换才能在更大的上下文中使用。标准技术是根据该段中使用的数字范围为每个段分配一系列值。要将文档编号从段转换为外部值,请添加段的基本文档编号。要将外部值转换回特定于段的值,将通过外部值所在的范围来标识该段,并减去该段的基值。例如,可以组合两个五个文档段,使得第一个段的基值为零,五个中的第二个段。来自第二段的文档3的外部值为8。
删除文档时,会在编号中创建间隙。随着索引通过合并演变,这些最终会被删除。合并段时删除已删除的文档。因此,新合并的细分市场的编号没有差距
索引结构概述
每个段索引都保持以下内容:
-
Segment info
:包含有关段的元数据,例如文档数,以及它使用的文件 -
Field names
: 包含索引中使用的字段名称集合 -
Stored Field values
: 对于每个文档,这包含属性 - 值对的列表,其中属性是字段名称。这些用于存储有关文档的辅助信息,例如其标题,URL或访问数据库的标识符。存储的字段集是搜索时为每个匹配返回的字段。这是由文件编号键入的 -
Term dictionary
: 字典包含所有文档的所有索引字段中使用的所有词。字典还包含包含该词的文档数量,以及指向词频和邻近度数据的指针. -
Term Frequency data
: 对于字典中的每个词,包含该词的所有文档的编号以及该文档中词的频率,除非省略频率(IndexOptions.DOCS_ONLY) -
Term Proximity data
: 对于词典中的每个词,词在每个文档中出现的位置。请注意,如果所有文档中的所有字段都省略位置数据,则不存在此操作 -
Normalization factors
: 对于每个文档中的每个字段,存储的该值乘以该字段上的匹配分数。 -
Term Vectors
. 对于每个文档中的每个字段,可以存储词向量(有时称为文档向量)。词向量由词文本和词频率组成。要将词向量添加到索引,请参阅Field
构造函数 -
Per-document values
: 与存储的值一样,这些值也由文档编号键入,但通常用于加载到主存储器中以便快速访问。存储值通常用于搜索的摘要结果,而每个文档值对于评分因子等内容非常有用. -
Deleted documents
: 一个可选文件,表示哪些文档已经被删除
文件名
属于一个段的所有文件具有相同的名称和不同的扩展名。扩展名对应于下面描述的不同文件格式。使用复合文件格式(默认为1.4及更高版本)时,这些文件(段信息文件,锁文件和已删除文档文件除外)将折叠为单个.cfs文件(有关详细信息,请参阅下文)
通常,索引中的所有段都存储在单个目录中,但这不是必需的
从版本2.1(无锁提交)开始,文件名永远不会被重用(有一个例外,“segments.gen”,见下文)。也就是说,当任何文件保存到目录时,它将被赋予一个前所未有的文件名。这是使用简单的世代方法实现的。例如,第一段文件是segments_1,然后是segments_2等。生成是以字母数字(基础36)形式表示的顺序长整数。
文件扩展名摘要
下表总结了Lucene中文件的名称和扩展名:
名称 | 扩展名 | 简要描述 | 源码文件 |
---|---|---|---|
Segments File |
segments.gen, segments_N | 存储有关提交点的信息 | SegmentInfos |
Lock File |
write.lock | 写锁定可防止多个IndexWriters写入同一文件. | |
Segment Info |
.si | 存储有关段的元数据 | Lucene40SegmentInfoFormat |
Compound File |
.cfs, .cfe | 一个可选的“虚拟”文件,由经常用完文件句柄的系统的所有其他索引文件组成. | CompoundFileDirectory |
Fields |
.fnm | 存储有关字段的信息 | Lucene40FieldInfosFormat |
Field Index |
.fdx | 包含指向字段数据的指针 | Lucene40StoredFieldsFormat |
Field Data |
.fdt | 存储的文档字段 | Lucene40StoredFieldsFormat |
Term Dictionary |
.tim | 词字典,存储词信息 | Lucene40PostingsFormat |
Term Index |
.tip | 词字典的索引 | Lucene40PostingsFormat |
Frequencies |
.frq | 包含每个词和频率的文档列表 | Lucene40PostingsFormat |
Positions |
.prx | 存储词在索引中出现的位置信息 | Lucene40PostingsFormat |
Norms |
.nrm.cfs, .nrm.cfe | 文档和字段的编码长度和提升因子 | Lucene40NormsFormat |
Per-Document Values |
.dv.cfs, .dv.cfe | 编码其他评分因子或其他每个文档信息 | Lucene40DocValuesFormat |
Term Vector Index |
.tvx | 存储文档数据文件中的偏移 | Lucene40TermVectorsFormat |
Term Vector Documents |
.tvd | 每个文档包含的词向量的信息 | Lucene40TermVectorsFormat |
Term Vector Fields |
.tvf | 关于术语向量的字段级信息 | Lucene40TermVectorsFormat |
Deleted Documents |
.del | 删除的文件信息 | Lucene40LiveDocsFormat |
Lock File
写锁默认存储在索引目录中,名为“write.lock”。如果锁目录与索引目录不同,则写入锁将命名为“XXXX-write.lock”,其中XXXX是从索引目录的完整路径派生的唯一前缀。当此文件存在时,writer当前正在修改索引(添加或删除文档)。此锁定文件确保一次只有一个writer正在修改索引。