谈谈lucene倒排索引的存储方式(一)

lucene的倒排索引存储包括词的索引数据存储、词的位置存储以及写入过程,这3个部分是比较复杂的准备分开描述,先谈谈位置的存储方式:

词的位置具体包括每篇文档中的词频、位置以及附带的payload(这里先忽略掉norm信息的存储),这3块lucene分别采用了3个输出流进行写入,具体写入过程如下:

1、对于每个词而言会记录该次所属的文档ID以及在该文档中的词频,由于文档ID已经排过序所以写入时会进行差值压缩存储,而文档词频会直接存储,并且每128条记录进行分块压缩存储;

2、令Doc=abc|123;bcd;def,每写完所属文档ID以及词频,就会写入该词在文档中的每个位置(指文档经过分词后的第n个词(分号为词的分隔符def为第3个词))、起始和结束的偏移量(指文档未分词时的开始和结束位置(bcd的开始和结束位置分别为8和11),通过偏移量可以算出词、payload以及payload分隔符的总长度,所以这个长度不要认为是词的长度和payload的长度(123为payload,对于abc的开始和结束位置分别为0和7))、每个词附带的payload信息。由于位置信息、偏移量已经排过序所以会按照差值压缩存储。位置信息会按照128条记录分块压缩存储到单独的文件中。payload的长度信息以及偏移量也按照128条记录分块压缩存储到单独的文件中而payload的内容并没有压缩而是直接写入同一个文件中。

90dfa9f188d8382edcd05d4d5760c41ab46.jpg

对于词频按照128条记录分块压缩是因为包含同一个词的文档可能非常多,极端情况下是所有文档都有。除了压缩还需要提供能够随机访问每篇文档位置信息的功能,因此对位置信息又建立了一层索引结构,而且是每个词对应一套索引。

索引需要记录的信息包括:上个块中最后一篇文档的ID,上个位置块的文件指针,上个payload块的文件指针,剩余未压缩的位置信息个数以及剩余未压缩的payload数组长度。(这块索引内容还是放到下篇详细说明)

当写完一个term时,对于剩余未达到128条记录的内容,文档ID和词频按照vint方式压缩,位置、payload长度和偏移量同样按照vint方式压缩而payload内容直接写入。

 

 

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值