谈谈lucene的数据域存储

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

lucene在写入数据的时候是按照数量达到必定阈值或者占用空间达到必定阈值后批量写入的,在写入的过程当中须要记录该数据块一共包含的文档数量、该数据块的起始文档编号、每篇文档的占用空间以及每篇文档包含的字段数量,而后将该元数据信息与数据内容经过压缩算法写入文件中。在随机访问某篇文档数据的时候,首先须要定位到该文档所在数据块的起始文件指针,而后经过解压算法还原出元数据信息与数据内容,最后经过元数据信息定位到该文档的指针位置并读取文档数据。总体的实现思路就是这样,其中的实现技巧或者是关键技术仍是数据的压缩问题。数据结构

fdt文件内容以下:.net

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

    文件头部分指针

                文档起始编号、文档数量、是否切片、每篇文档存储字段的个数、每篇文档的占用空间blog

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

                文档数量是该数据块中包含的文档数,由于在数据块划分的条件是(数量达到必定阈值或者占用空间达到必定阈值),所以块中包含的数量是个变量,须要记录下来;文档

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

                每篇文档存储字段的个数是指lucene在存储文档的时候,每篇文档间的字段能够互不相同,因此个数也不一样;源码

                每篇文档的占用空间是指每一个文档实际占用的字节数;

    数据域部分

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

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

    分片总个数

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

fdx文件内容以下:

      fdx文件的做用在前面已经说过,它实现的关键也是如何压缩数据,进一步减小空间。因为文件指针是个long类型的值,而且当fdt文件每次flush一个数据块时就提交一次(极端状况下是一篇文档提交一次)通常较大,所以文件指针也是当达到必定数量后进行批量存储便于进一步压缩。为啥要压缩呢,由于fdx文件是常驻内存的。

      该文件也是按照分块的方式对文件指针批量写入并压缩存储,它须要存储分块的个数、每块每一个分片起始的文档编号每一个块中每一个分片的fdt文件指针,因为每一个块中每一个分片中包含文档的数量与文档数据占用空间是很接近的,这里的压缩采用了与MonotonicLongValues相似的处理方法即去掉线性趋势,让序列平稳化。

相关文章
相关标签/搜索