您的位置:首页 > 其它

Lucene初探之数据格式详情(-)

2017-02-15 23:30 246 查看

Lucene初探之数据格式详情(-)

在前两篇,我们介绍了Lucene的存储文件目录中的各个文件的大致关系。比如以层次规则保存的正向信息:

索引–>段–>文档–>域–>词

目录–>segment_N–>.fdx,.fdt–>.fnm–>.tvx,.tvd,.tvf

当然,除了正向信息之外,还包括反向信息,以及和Lucene系统相关的一些特定的信息,现在,我们来一一了解。

正向信息:

其实上述文件的关系相对而言严格来说是不准确的,因为segment文件其实存储的是段的元数据信息,是每个Index一个,但是段的真正的内容被存储在域和词之中。

段的元数据信息: 一个索引可以内存储在多个不同的segment中,然而,当我们要打开索引的时候,则必须要打开一个索引文件,并且只能选择一个,那么我们要如何去选择呢?

Lucene的解决方案是这个样子的:

在所有的segment_N的文件中选择N最大的文件打开,基本思路是参照SegmentInfos.getCurrentSegmentGeneration(File[] files), 其基本思路是在所有的以segment为前缀的文件中选择N最大的文件作为genA,当然,这里排除了segments.gen文件;

第二,打开segments.gen,其中保存了当前的N值,其格式如下,读出版本号(version),然后再读出两个N,如果相等,则作为genB.

其三,对比genA和genB,选择其中N大的那个,然后打开对应的segments_N;

Versiongen0gen1
代码:

IndexInput getInput = directory.openInput(IndexFileName.SEGMENTS_GEN);
int version = genInput.readInt();
if (version == FORMAT_LOCKLESS) {
long gen0 = genInput.readLong();
long gen1 = genInput.readLong();
if (gen0 == gen1) {
genB = gen0;
}
}


Format

索引文件版本号,随着Lucene开发的不断进行而不断变大,当IndexReader是由A版本创建,但是却读取B版本的索引时,其会出错;

Version

索引的版本号,记录了IndexWriter的修改提交次数,初始值一般从索引文件中读出,被赋予一个初始时间,随后每一次对索引的修改都会导致此版本号变更,在Lucene中,一般用此来判断当前是否为最新的修改后的索引;IndexReader被创建后,当再次读的时候一般会对此进行比较,当IndexReader自己保存的version和当前索引的Version相同时,表示当前索引没有被修改过,是最新的,直接读取不会出错。

NameCount

是下一个新段的段名,所有属于同一个段的索引文件都以段名作为文件名,新生成的段名一般是当前最大段名加一。

SegCount个段的元数据信息:

SegName

段名,所有属于同一个段的文件都以段名来命名文件

SegSize

此段中包含的文档数,包含已被删除,但又没有optimize的文档;

DelGen

.del文件版本号,在重新optimize之前,被删除的文件都被包含在.del文件中;每次IndexWriter对索引进行删除之后,该值都会自增1,并且会生成一个新的.del文件;

……未完待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息