lucene的词向量即TermVectors记录的是每篇文档每个字段每个词的词频、位置、字符偏移量、payload信息,与数据域的存储有着相似的实现思路同样由两个文件组成,一个是数据文件采用分片压缩存储的方式文件后缀名是tvd,另一个是索引文件用于随机获取某个文档某个字段的词向量信息文件后缀名为tvx。
在写入向量文件数据的时候同样是按照(数量达到一定阈值或者占用空间达到一定阈值)后批量写入的,具体实现时会对分别对每个字段的每个词进行前缀压缩(因为词是经过预处理排过序的,此时需要单独存储每个词公共前缀长度和后缀长度),对于payload除了存储值外还要记录值的长度进行数据还原。实际上对于词频、位置、字符偏移量都分别使用数组进行保存的,最后在真正写入到文件中的时候还会进行进一步压缩。(实际上lucene为了压缩在实现的时候下了很大功夫)
tvx文件的存储与谈谈lucene的数据域存储中的方式相同,这里重点说明tvd文件的存储结构:
分片大小是预先设定的值
文档起始编号是在数据块中的起始的文档编号,而且是全局的;
文档数量是该数据块中包含的文档数,因为在数据块划分的条件是(数量达到一定阈值或者占用空间达到一定阈值),因此块中包含的数量是个变量,需要记录下来;
每篇文档包含的字段个数
所有文档包含的字段经过去重和使用字段编号进行排序后进行保存
每篇文档包含的各个字段下标(这样节省空间)
每篇文档各个字段标识:是否包含positions, offsets, payloads(注意,不同文档同一字段的标识可以不同,感觉这样设计过于灵活)
每篇文档各个字段中包含词的总个数
每篇文档各个字段中每个词的前缀长度和后缀长度
每篇文档各个字段中每个词的频次
每篇文档各个字段中每个词的位置信息(由于位置是从小到大排过序的,因此采用了差值压缩存储)
每篇文档各个字段中每个词的偏移量和长度
每篇文档各个字段中每个词后面附带的payload长度
分片总个数