谈谈lucene的DocValues特性之SortedDocValuesField

lucene的DocValues不同于document文档级别的存储,它是一个面向列的存储结构,提供从文档编号到值的映射功能。根据不同的数据类型和应用场景支持多个DocValuesField类型,SortedDocValuesField便是其中之一,主要的作用是提供字符串值的排序功能(如根据检索条件筛选出结果集后根据某个字符类型的字段进行排序)。

先说明一下SortedDocValuesField存储的逻辑结构:

给定三个文档doc[0]='abc',doc[1]='abd',doc[2]='abc',值经过排序去重后变成'abc'=0,'abd'=1,那么原始的三篇文档会变成doc[0]=0,doc[1]=1,doc[2]=0。在这样的结构下排序尤其是海量数据时候,无需将原始数据读取到内存中进行排序,只需根据文档的ID号从磁盘中读取排序字段的序号,然后通过优先级队列取前N条记录即可。

SortedDocValuesField存储的物理结构主要包含以下几个步骤:

1、首先dvd数据文件会写入文档->序号的对应关系,dvm索引文件会记录相应的文件指针(代表dvd文件的XXX-XXX部分记录的是对应关系)

2、然后dvd数据文件会写入已去重并排好序的具体的值,由于排好序,因此采用了前缀压缩算法,并且在记录前后缀长度的时候先尽量用1个字节进行压缩存储(因为在大部分情况下,排序的字段值一般长度都比较小,比如去掉格式符的字符串日期类型仅14位),前缀长度先采用低4位保存超过15后使用vint保存,后缀长度由于最小值为1因此先减去1在左移4位采用高4位进行保存超过16后使用vint保存。为了保证前缀压缩效率lucene是每隔16条记录进行前缀压缩一次,因为记录越靠后公共的前缀越少采用前缀压缩反而增加了占用空间。

3、最后写入能够根据词典值随机获取词典序号的索引数据。在写入时lucene按照每1024条记录采用前缀压缩算法,并且只记录前缀值。

注意:由于词典值在写入时采用了BytesRefHash,所以值的长度最大只能是32766,详细可参考谈谈lucene中的BytesRefHash

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值