谈谈lucene的词向量存储结构

lucene的词向量即TermVectors记录的是每篇文档每一个字段每一个词的词频、位置、字符偏移量、payload信息,与数据域的存储有着类似的实现思路一样由两个文件组成,一个是数据文件采用分片压缩存储的方式文件后缀名是tvd,另外一个是索引文件用于随机获取某个文档某个字段的词向量信息文件后缀名为tvx。数组

在写入向量文件数据的时候一样是按照(数量达到必定阈值或者占用空间达到必定阈值)后批量写入的,具体实现时会对分别对每一个字段的每一个词进行前缀压缩(由于词是通过预处理排过序的,此时须要单独存储每一个词公共前缀长度和后缀长度),对于payload除了存储值外还要记录值的长度进行数据还原。实际上对于词频、位置、字符偏移量都分别使用数组进行保存的,最后在真正写入到文件中的时候还会进行进一步压缩。(实际上lucene为了压缩在实现的时候下了很大功夫).net

tvx文件的存储与谈谈lucene的数据域存储中的方式相同,这里重点说明tvd文件的存储结构:设计

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

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

文档数量是该数据块中包含的文档数,由于在数据块划分的条件是(数量达到必定阈值或者占用空间达到必定阈值),所以块中包含的数量是个变量,须要记录下来;索引

每篇文档包含的字段个数文档

全部文档包含的字段通过去重和使用字段编号进行排序后进行保存get

每篇文档包含的各个字段下标(这样节省空间)源码

每篇文档各个字段标识:是否包含positions, offsets, payloads(注意,不一样文档同一字段的标识能够不一样,感受这样设计过于灵活)it

每篇文档各个字段中包含词的总个数

每篇文档各个字段中每一个词的前缀长度和后缀长度

每篇文档各个字段中每一个词的频次

每篇文档各个字段中每一个词的位置信息(因为位置是从小到大排过序的,所以采用了差值压缩存储)

每篇文档各个字段中每一个词的偏移量和长度(在压缩偏移量时,lucene会统计每一个字段每一个词的平均长度,而后将在偏移量采用差值压缩的基础上再减去平均长度;在写入长度时,通常状况下是前缀长度与后缀长度之和,可是因为payload的存在,将长度减去前缀长度与后缀长度之和后,大部分值为0,所以节省了空间)

每篇文档各个字段中每一个词后面附带的payload长度

分片总个数

注意:以上都是根据代码总结出来的,最好是直接看源码能够知道更多的实现细节(不得不认可lucene确实为压缩下了很大的功夫)

相关文章
相关标签/搜索