BKD 树(Block KD-Tree)Lucene

BKD 树(Block KD-Tree)是 Lucene 用来存储和快速查询 **多维数值型数据** 的一种磁盘友好型数据结构,可以把它想成:

> **"把 KD-Tree 分块压缩后落到磁盘上,既能做磁盘顺序读,又能像内存 KD-Tree 一样做范围/最近邻搜索。"**

核心要点(5 句话):

  1. **存储内容**

只存 **数值/日期/geo 点** 的多维坐标(int、long、float、double、geo_point ...),**不存文本倒排**。

  1. **结构**

• 依旧按 KD-Tree 方式递归切分维度;

• 每满 1024 个点就写成一个 **block**(顺序磁盘页),天然压缩 & 缓存友好。

• 所有叶子块再建一个 **内存索引**(min-max 值 + 文件指针),查询时先扫内存索引→定位少量磁盘块→顺序读,几乎无随机 IO。

  1. **支持的查询**

• 范围查询:price ≥ 50 AND price < 100

• 距离查询:geo_distance 5 km 内

• 最近邻:knn_vector search

复杂度 **O(log N)**,且由于顺序 IO,实际比 KD-Tree 在磁盘上快很多。

  1. **优点**

• 磁盘顺序读友好 → SSD/HDD 都高效

• 压缩率极高 → 同样数据体积 < 1/4 原始数组

• 支持 **实时增删改**(新文档追加新 block,后台合并)

  1. **在 Elasticsearch 中的位置**

• 所有 `long`, `integer`, `double`, `date`, `ip`, `geo_point`, `geo_shape`, `dense_vector` 字段,**默认**就用 BKD 树存维度数据;

• 因此 `range`, `geo_distance`, `knn` 查询都走 BKD 而非倒排索引。

一句话:

**BKD 树就是 Lucene 的"多维数值索引硬盘版",让范围/距离/最近邻查询在磁盘上也像内存 KD-Tree 一样快。**

相关推荐
我命由我123455 分钟前
Android 设备的日志缓冲区被写满,logcat: Unexpected EOF!
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
xcl092510 分钟前
分销返利商城系统开发实战:返利算法与架构设计指南
java·spring boot
船厂电气自动化ai大模型12 分钟前
AI大模型与数学第64课:矩阵×向量乘法(神经网络矩阵运算底层)
数据结构·深度学习·线性代数·机器学习·推荐算法
171320330计算机毕设编程15 分钟前
2027计算机毕设五大方向对比&选题推荐
java·ide·python·算法·django·php·推荐算法
171320330计算机毕设编程16 分钟前
基于SpringBoot的在线拍卖系统
android·java·spring boot·小程序·课程设计
未秃头的程序猿21 分钟前
一次秒杀把服务打挂了,我用Sentinel规则配置化救了回来
java·后端·spring cloud
Zane199423 分钟前
明明没删字段,反序列化却报错:都是隐式 serialVersionUID 惹的祸
java·后端
0xBADCODE26 分钟前
动态DEX加载+反射+DES硬编码密钥:安卓三层逆向实战
android·java·python·安全·网络安全·逆向·ctf
被摘下的星星30 分钟前
Java 中 .length、.length() 以及 .size() 的区分
java·开发语言
代码不停35 分钟前
子数组问题
java·算法