Lucene 索引文件的生成(二十五)之kdd&kdi&kdm

在系列文章索引文件的生成(Lucene 7.5.0)中,我们介绍了存储维度(见文章Bkd-Tree)值大于等于2的数值类型对应的索引文件的生成过程。对于维度值等于1的情况,其生成过程有少许的不同。为了后续便于介绍该类型的索引文件的合并,我们需要再写一篇文章来介绍其生成过程。

索引文件的变更

图1:

  从Lucene 8.6.0开始,用于存储点数据(point value)的索引文件由原先的索引文件dim&&dii,改为三个索引文件kdd&kdi&kdm,其变更的目的可以看这个issue,本文中不展开讨论。

  给出图1的目的是为了说明,点数据对应的索引文件,其生成的总体流程没有太大变动的,下文中介绍维度值为1的生成过程(基于Lucene 8.7.0)时,只会介绍与维度值大于等于2的不同的流程点,其相同的流程点可以参考系列文章索引文件的生成基于Lucene 7.5.0)。

差异

  维度值为1的生成索引文件的过程中,唯一不同点在于图1中的流程点构建BKD树的节点值(node value),如下所示:

图2:

点击查看大图

  图2中,红框标注的流程点表示在这些流程点的处理方式是一致的。

生成索引文件kdd&kdi&kdm的流程图

图3:

节点

图4:

  流程点节点中包含了在索引(Indexing)期间收集的点数据信息,收集相关的介绍见文章索引文件的生成(八)

节点内的点数据排序

图5:

  无论维度的数量是多少,最终生成的bkd树的每个叶子节点中的点数据是有序的。对于维度大于等于2的情况,叶子节点中点数据的排序规则取决这个叶子节点的父节点在进行左右子树划分时选择的某个维度,对应图2中流程点内部节点的排序,该流程点的详细介绍见文章索引文件的生成(十)。对于维度等于1的情况,由于不用考虑选择哪个维度进行排序,所以对于某个点数据域来说,直接对flush/commit收集到的全量点数据进行排序即可,随后对这个有序的集合按块划分(下文会介绍)后,每一块中的点数据集合将被写入到一个叶子节点,如下所示。另外排序使用的算法为最大有效位的基数排序(MSB radix sort)。

图6:

点击查看大图

  当然了,排序过程中并不会真正的去改变排序前的点数据集合,通过一个int类型的ord[ ]实现一个映射关系来描述排序关系。同样关于ord[ ]数组的介绍可以看文章 索引文件的生成(十)之dim&&dii

统计leafCardinality以及其他一些信息

图7:

  在获得了有序的点数据集合后,接着有序的依次取出每一个点数据,每处理一个点数据,需要统计leafCardinality以及其他一些信息。

leafCardinality

  对于一个有序的集合,可以划分为一个或多个区间,要求每个区间内至少包含一个数据,如果包含多个数据,那么要求所有的数据是相同的,leafCardinality描述的正是区间数量。

图8:

  随后在图2的流程点写入不同后缀信息到索引文件.kdd中中,会根据根据leafCardinality的值来选择(用于来判断是否使用游标编码(Run Length Encoding)存储)存储开销较低的数据结构来存储点数据的后缀信息。同样的,详细的过程见文章索引文件的生成(十三)的介绍。

 

剩余内容看这里:https://www.amazingkoala.com.cn/Lucene/Index/2020/1217/185.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值