谈谈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的内容并没有压缩而是直接写入同一个文件中。

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

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

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

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

 

 

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

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索