Lucene 索引文件的合并(四)之kdd&kdi&kdm

本篇文章开始介绍索引文件kdd&kdi&kdm的合并,由于维度值为1维度值大于等于2的点数据对应的索引文件的合并方式有较大的差异,故我们分开介绍。本篇文章先对维度值为1的情况展开介绍,建议先阅读文章索引文件的生成(二十五)之kdd&kdi&kdm,了解下维度值为1的点数据是如何生成索引文件的。

索引文件kdd&kdi&kdm的合并流程图(维度值为1)

图1:

  图1中,流程点构建BKD树的节点元数据(node metadata)生成索引文件.dim的元数据索引文件的生成(九)之dim&&dii是一模一样的,唯一的差异在构建BKD树的节点值(node value)中,我们看下该流程点是如何运作的。

构建BKD树的节点值(node value)流程图 维度值等于1

图2:

  图2中我们分别给出了维度为1的点数据在执行索引文件的合并以及索引文件的生成中对应的流程点构建BKD树的节点值(node value),可以看出,红框标注的流程点是一样,见文章索引文件的生成(二十五)之kdd&kdi&kdm的介绍,不赘述。在索引文件的生成中,流程点节点内的点数据排序执行结束后,就获得了有序的点数据集合,随后有序的读取每一个点数据来执行剩余的流程点;在索引文件的合并中,则是通过一个优先级队列,使得可以从所有的待合并的索引文件中获取有序的点数据,随后执行剩余的流程点。

待合并集合

图3:

  待合并集合即MergeState对象中用于描述所有段的点数据信息的PointsReader集合,该集合中每一个reader描述了一个段中索引文件kdd&kdi&kdm的信息。MergeState对象的详细介绍见文章索引文件的合并(一)之fdx&&fdt&&fdm

初始化优先级队列

图4:

  使用优先级队列的目的是为了能从多个待合的段中按照字典序有序的获得点数据,因为bkd树中每个叶子节点中的点数据是有序的,并且对于某个叶子节点,它包含的最小的点数据肯定是大于等于左边的叶子节点中的最大的点数据,并且小于等于右边的叶子节点中的最小的点数据。从优先级队列中读取出的点数据可以看成生成一个有序的集合,使得可以实现按块划分(见文章索引文件的生成(二十五)之kdd&kdi&kdm的介绍)。优先级队列的排序规则为点数据的值的字典序。

图5:

优先级队列中的元素

  在源码中,这个优先级队列叫做BKDMergeQueue,该优先级队列中的元素是MergeReader对象。我们介绍下MergeReader对象中一些重要的成员:

看这里:https://www.amazingkoala.com.cn/Lucene/Index/2020/1222/186.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值