java 向量存储_谈谈lucene的词向量存储结构

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

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

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

分片大小是预先设定的值

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

文档数量是该数据块中包含的文档数,因为在数据块划分的条件是(数量达到一定阈值或者占用空间达到一定阈值),因此块中包含的数量是个变量,需要记录下来;

每篇文档包含的字段个数

所有文档包含的字段经过去重和使用字段编号进行排序后进行保存

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

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

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

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

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

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

每篇文档各个字段中每个词的偏移量和长度

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

分片总个数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值