谈谈lucene的数据域存储

本文深入解析了Lucene的文档存储机制,详细介绍了fdt和fdx文件的作用及内容,阐述了数据块的批量写入过程,以及如何通过ID定位文档,同时讨论了数据压缩对效率的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

fdt文件内容如下:

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

    文件头部分

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

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

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

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

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

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

    数据域部分

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

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

    分片总个数

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

fdx文件内容如下:

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

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

   

       

        

转载于:https://my.oschina.net/u/1268334/blog/2983715

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值