lucene的数据域也就是存储document文档的区域,只能通过ID号来定位文档,定位后可根据指定的字段获取所需数据。粗略的说fdt文件存储数据,fdx文件用于通过ID号来定位文档。(注:以下列出的内容只包含关键数据结构的原理部分,因为lucene在设计的时候考虑到各个版本的兼容性问题和数据文件的完整性问题,而且也不是对源代码的完整解析,有兴趣的自己直接看源码吧)

lucene在写入数据的时候是按照(数量达到一定阈值或者占用空间达到一定阈值)后批量写入的,fdt文件内容如下:

    分片大小---是预先设定的值

    文件头部分

                文档起始编号、文档数量、是否切片、每篇文档存储字段的个数、每篇文档的文件偏移量

                文档起始编号是在数据块中的起始的文档编号,而且是全局的;

                文档数量是该数据块中包含的文档数,因为在数据块划分的条件是(数量达到一定阈值或者占用空间达到一定阈值),因此块中包含的数量是个变量,需要记录下来;

                是否切片是指如果数据块>=2倍的分片大小时就按每数据块大小进行分片压缩,目的在于如果只对文档的第一个字段感兴趣就不用等待整个文档解压完毕后进行访问,只需解压指定数据块的大小,提高效率;注意:lucene的单个文档大小不能大于(1<<31)-分片大小(默认值是1<<14即16KB),原因就在于切片处理的过程中会发生整型值溢出问题!

                每篇文档存储字段的个数是指lucene在存储文档的时候,每篇文档间的字段可以互不相同,所以个数也不同;

                每篇文档的文件偏移量是指每个文档从文件中读取的起始地址,实际上lucene进行了进一步处理,除了第一篇文档其余的存储是差值,这样也可起到压缩效果;

    数据域部分

                按照分片大小切分,对数据块采用LZ4压缩算法

                数据块具体包括:字段ID、字段类型、字段值,不同的字段类型采用不同的写入方式,尤其是整型值和浮点型的压缩在结合lucene谈谈日期的压缩问题结合lucene谈谈浮点数的压缩问题中也已经提过,有兴趣的可以看看。

    分片总个数

                就是一共分了多少个数据块

fdx文件内容如下:

      每个分片包含的文档数量、fdt的文件指针        

       由于文件指针是个long类型的值,并且当fdt文件每次flush一个数据块时就提交一次(极端情况下是一篇文档提交一次)一般较大,因此文件指针也是当达到一定数量后进行批量存储便于进一步压缩。

       具体包括:分片个数、文档起始编号、每个分片中的文档数量、每个分片的起始文件指针

       lucene在具体实现的时候对这些数据作了进一步的压缩处理。

       

        

12-08 17:59