Lucene 6 数值索引以及空间索引方案
|
要解决的问题
在一个二维平面上,有很多点,给定一个矩形,怎么快速的将落在矩形中的点找出来?
离我最近的餐馆有哪些? 一维的场景这个场景非常简单,只需要将数值类型数据做个全排序,不管是范围查询还是近邻查询只需要进行二分搜索就好了。 如果数据集特别大,内存中放不下,上面的方案就会有问题,因为所有数据没有办法全部 load 到内存中。 这个时候可以在内存中维护一份索引,索引的构建过程如下:
上述索引构造完成之后,查询过程中首先将索引 load 到内存中,先在索引中查询,最后再将命中的数据块 load 到内存中进行查询。 范围查询
k 近邻查询
此时小根堆中的 k 个数据就是查询数值的 k 近邻。
高维场景有了一维场景,非常容易推广到高维的场景。 构建过程
这里的关键就是怎么选择在哪一个维度上将数据进行划分,这个和数据在该维度上的分布关系很大,遵循的原则是在这一步骤中,该维度的数据分布最散。 范围查询和一维的区别在于每一次划分 query range 要在相应的维度划分,其他没有任何变化。 k 近邻查询和一维的区别在于回溯的过程中,查询点到超平面距离计算要相应的变化,其他没有区别。 merge 过程中的优化两份索引 merge,对于一维的数据,可以使用归并排序,高维场景则需要当成一份数据集来处理,目前没有什么好的方法来优化高维数据 merge 的速度。 总结
上面的方案就是 lucene 6 对数值类数据(高维)范围查询和近邻查询的优化方案 (bkd tree),相比之前的前缀编码的方案,存储空间大约能节省 50%,查询速度提高 2 倍。 参考资料
|
时间:2018-11-11 23:33 来源: 转发量:次
声明:本站部分作品是由网友自主投稿和发布、编辑整理上传,对此类作品本站仅提供交流平台,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。