BKD Tree也叫 Block KD-tree,根据FST思路,如果查询条件非常多,需要对每个条件根据 FST 查出结果,进行求并集操作 。如果是数值类型,那么潜在的 Term 可能非常多,查询销量也会很低,为了支持高效的数值类或者多维度查询,引入 BKD Tree 。在一维下就是一棵二叉搜索树,在二维下是如果要查询一个区间,logN的复杂度就可以访问到叶子节点对应的倒排链 。

- 确定切分维度,这里维度的选取顺序是数据在这个维度方法最大的维度优先 。一个直接的理解就是,数据分散越开的维度,我们优先切分 。
- 切分点的选这个维度最中间的点 。
- 递归进行步骤1,2,我们可以设置一个阈值,点的数目少于多少后就不再切分,直到所有的点都切分好停止 。

BitSet 过滤二进制处理,通过BKD-Tree查找到的docID是无序的,所以要么先转成有序的docID数组,或者构造BitSet,然后再与其他结果合并 。
IndexSorting
IndexSorting是一种预排序,在ES6.0之后才有,与查询时的Sort不同,IndexSorting是一种预排序,即数据预先按照某种方式进行排序,它是Index的一个设置,不可更改 。
一个Segment中的每个文档,都会被分配一个docID,docID从0开始,顺序分配 。在没有IndexSorting时,docID是按照文档写入的顺序进行分配的,在设置了IndexSorting之后,docID的顺序就与IndexSorting的顺序一致 。
举个例子来说,假如文档中有一列为Timestamp,我们在IndexSorting中设置按照Timestamp逆序排序,那么在一个Segment内,docID越小,对应的文档的Timestamp越大,即按照Timestamp从大到小的顺序分配docID 。
IndexSorting 之所以可以优化性能,是因为可以提前中断以及提高数据压缩率,但是他并不能满足所有的场景,比如使用非预排序字段排序,还会损耗写入时的性能 。
搜索引擎正是靠优秀的理论加极致的优化,做到查询性能上的极致,后续会再结合源码分析压缩算法如何做到极致的性能优化的 。
推荐阅读
- 网络电话的原理是什么
- 网络爬虫的原理
- 网桥的工作原理
- 网络传输的原理
- 太阳能热水器工作原理 太阳能热水器的基本参数
- 软件无线电原理与应用 5g网络架构及关键技术分析
- 入射面和折射面的定义及其物理原理 入射面和折射面的定义是什么
- 机械原理关于斜齿轮重合度的问题
- 机械千斤顶的原理急
- 机械制冷的原理
