lucene的倒排索引存储包括词的索引数据存储、词的位置存储以及写入过程,这3个部分是比较复杂的准备分开描述,先谈谈位置的存储方式:数组
词的位置具体包括每篇文档中的词频、位置以及附带的payload(这里先忽略掉norm信息的存储),这3块lucene分别采用了3个输出流进行写入,具体写入过程以下:3d
一、对于每一个词而言会记录该次所属的文档ID以及在该文档中的词频,因为文档ID已经排过序因此写入时会进行差值压缩存储,而文档词频会直接存储,而且每128条记录进行分块压缩存储;指针
二、令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的内容并无压缩而是直接写入同一个文件中。orm
对于词频按照128条记录分块压缩是由于包含同一个词的文档可能很是多,极端状况下是全部文档都有。除了压缩还须要提供可以随机访问每篇文档位置信息的功能,所以对位置信息又创建了一层索引结构,并且是每一个词对应一套索引。blog
索引须要记录的信息包括:上个块中最后一篇文档的ID,上个位置块的文件指针,上个payload块的文件指针,剩余未压缩的位置信息个数以及剩余未压缩的payload数组长度。(这块索引内容仍是放到下篇详细说明)索引
当写完一个term时,对于剩余未达到128条记录的内容,文档ID和词频按照vint方式压缩,位置、payload长度和偏移量一样按照vint方式压缩而payload内容直接写入。文档