Lucene 6.0 索引结构

1.复合文件索引

该模式是默认的。

1.1 目录结构

Lucene 6.0 索引结构
图 1-1 复合文件索引

1.2 _x.cfe

1.3 _x.cfs

1.4 _x.si


2.多文件索引

IndexWriterConfig org.apache.lucene.index.IndexWriterConfig.setUseCompoundFile(boolean useCompoundFile)
调用此函数可以设为多文件索引模式。

2.1 目录结构

Lucene 6.0 索引结构
图2-1 多文件索引

2.2 _x.fdt

通常在搜索打分完毕后,IndexSearcher会返回一个docID序列,但是仅仅有docID我们是无法看到存储在索引中的document,这时候就需要通过docID来得到完整Document信息,这个过程就需要对fdx/fdt文件进行读操作。
fdx/fdt文件就是Lucene的正向文件。有一个比喻:如果fdt是一本书的正文,那么fdx则是书的目录。显然fdt文件大于fdx。
通过docID读取到document需要完成Segment、Block、Chunk、document四级查询。Segment、Block、Chunk的查找都是二分查找,速度很快,但是Chunk中定位document则是顺序查找,所以Chunk的大小直接影响着读取的性能。

fdt文件的基本单位是Chunk

当你在程序中存储某个域时(使用Field.Store.YES选项),该域会被写入两个文件:.fdx与.fdt。

2.3 _x.fdx

fdx的基本单位是Block。一个Block由三个部分组成,见图2-2,.fdx文件结构。最顶层的ChunkIndex跟倒数第三层的BlockCunks不是一个东西。

· BlockChunks表示当前Block中Chunk的个数;

· <DocBases>表示当前Block中每个Chunk的doc个数,可以看作一个数组;

· <StartPointers>表示当前Block中每个Chunk在fdt文件中的起始位置,其结构与<DocBases>相同。

Lucene 6.0 索引结构

图2-2 .fdx文件结构


2.4 _x.fnm

.fnm文件存储了段中相关文档的所有field信息。包括“该域是否被索引?该域是否允许使用项向量?”等。
此文件中的field不一定按字母顺序排列,每个field都有一个fieldNo编号,它会在其他索引文件中被用到,用来节省空间。

2.5 _x.nvd


2.6 _x.nvm


2.7 _x.si

3.共同的文件

3.1segments_x

x为IndexWriter的写入次数,从1开始计数。