倒排表(中)

本篇文章介绍使用了词向量(TermVector)后的域生成的倒排表,在索引阶段,索引选项(indexOptions)不为NONE的域会生成一种倒排表(上),这种倒排表的特点是所有文档的所有域名的倒排表都会写在同一张中,后续会读取倒排表来生成.doc.pos&&.pay.tim&&.tip.fdx&&.fdx.nvd&&.nvm等索引文件。而本文章中设置了TermVector的域会生成另外一张倒排表,并且一篇文档中生成单独的倒排表,同文档中的所有域名的倒排表写在同一张中,并且后续生成.tvd、.tvx文件。 尽管有两类倒排表,但是实现逻辑是类似的,一些预备知识,下面例子中出现的各种数组、文档号&&词频组合存储、position&&payload 组合存储、倒排表存储空间分配跟扩容等概念在倒排表(上)中已经介绍了,这里不赘述。

两种倒排表的区别与联系

索引选项(indexOptions)不为NONE的域.YES生成的倒排表数据结构如下: 图1: TermVector生成的倒排表数据结构如下: 图2:

区别与联系

例子

图3: 上图说明:

上文中提到每篇文档都会生成一个独立的倒排表,所以我们只介绍文档0中的域生成倒排表的过程。 图4:

写入过程

处理文档0

处理域名“content”

例子中使用的是自定义分词器PayloadAnalyzer,所以对于域名“content”来说,我们需要处理 "the"、“book”、“is”、"book"共四个term。

处理 “the”

图5:

ByteBlockPool对象的buffers数组
IntBlockPool对象的buffers数组
lastPositions[]数组
freq[]数组
lastOffsets[]数组
处理 “book”

图6:

ByteBlockPool对象的buffers数组
textStarts[] 数组

数组元素值14作为 索引选项(indexOptions)不为NONE的域生成的倒排表中的ByteBlockPool对象的buffers数组的下标,就可以获得"book"的term信息

处理 "is"

图7:

ByteBlockPool对象的buffers数组
处理 "book"

图8:

ByteBlockPool对象的buffers数组

处理域名“content”

处理 “book”

图9:

结语

本篇文章介绍了如何构建TermVector生成的倒排表,在后面的文章中还会再介绍一个倒排表,即MemoryIndex中的倒排表

点击下载Markdown文件