本篇文章开始介绍索引文件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