源码系列索引文件
当设置了TermVector的域生成了 倒排表 以后,将文档的词向量信息写到.tvx(vector_index)跟.tvd(vector_data)文件中。
数据结构
.tvd
图1:
PackedIntsVersion
PackedIntsVersion描述了压缩使用的方式,当前版本中是VERSION_MONOTONIC_WITHOUT_ZIGZAG。
ChunkSize
ChunkSize用来在压缩存储域值信息的方式,后面会详细介绍。
Chunk
图2:
在文档数达到128篇之前,如果这些文档中的所有存储域的域值长度达到4096,或者文档数达到128篇,那么就使得这些文档的信息生成一个Chunk。
DocBase
DocBase是chunk中第一个文档的文档号。
ChunkDocs
chunk中包含的文档个数。
NumFields
NumFields记录了每篇文档中存储域的个数NumField,根据chunk中的个文档数chunkDocs,分为不同的情况:
chunkDocs == 1
图3:
直接记录该片文档的存储域的个数NumField。
chunkDocs ≥ 1
图4:
记录chunk中的每一篇文档的存储域的个数,使用PackedInts存储。
FieldNums
FieldNums中存储当前chunk中域的种类,根据域的编号来获得 域的种类,根据域的种类个数分为不用的情况:
(域的种类 - 1) ≤ 7
图5:
token
token是一个组合值,并且大小是一个字节:
- numDistinctFields:当前chunk中的域的种类
- bitsRequired:存储每一个域的编号需要最少bit位个数
- 左移5位描述了bitsRequired最多可以是31
- 由于一个字节的低五位被用来描述bitsRequired,所以还剩余3个字节可以用来表示numDistinctFields,所以numDistinctFields ≤ 7时可以跟bitsRequired使用一个字节存储。
PackedIntsValue
把所有的域的编号用PackedInts存储。
(域的种类 - 1) > 7
图6:
token
token是一个组合值,并且大小是一个字节:
- bitsRequired:存储每一个域的编号需要最少bit位个数
- numDistinctFields的值大于7,那么在token中就是 (7 « 5 ) | bitsRequired
- numDistinctFields - 0x07:存储剩余的差值
FieldNumOffs
图7:
FieldNumOffs中存放了chunk中每一篇文档包含的所有域的编号的索引,并且使用PackedInts存储,该索引其实就是fieldNums[]数组的下标值,fieldNums[]数组的数组元素是chunk中的域的编号,数组元素个数是域的种类。通过这种方式使得不直接存储域的编号,因为域的编号可能跨度很大,并且值很大,那就需要更大的存储空间,而存储下标值就可以解决这个问题。
图8:
上图中有4个域的编号,如果直接存储域的编号,那么需要 3 (8) + 8 (255) + 2 (2) + 2 (3) = 15个bit位,如存储索引即小标志时,那么需要 1 (0) + 1 (1) + 2 (2) + 2 (3) = 6个bit位。
Flags
Flags用来描述域是否存放位置position、偏移offset、负载payload信息,flag的值可以是下面3个值的组合:
- 0x01:包含位置position信息
- 0x02:包含偏移offset信息
- 0x04:包含负载payload信息
比如说 flag = 3,二进制即0b00000011,即包含位置跟偏移信息。
根据相同域名在不同的文档中是否有相同的Flag分为不同的情况:
相同的域名有相同的flag
图9:
对于某个域名来说,无论它在哪个文档中都记录相同的flag信息,所以只要每种域名记录一次即可,并且
- 原文作者:知识铺
- 原文链接:https://geek.zshipu.com/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%BA%90%E7%A0%81%E7%B3%BB%E5%88%97%E7%B4%A2%E5%BC%95%E6%96%87%E4%BB%B6/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com