BKD 樹(Block KD-Tree)是 Lucene 用來存儲和快速查詢 **多維數值型數據** 的一種磁盤友好型數據結構,可以把它想成:
> **“把 KD-Tree 分塊壓縮后落到磁盤上,既能做磁盤順序讀,又能像內存 KD-Tree 一樣做范圍/最近鄰搜索。”**
核心要點(5 句話):
1. **存儲內容** ?
只存 **數值/日期/geo 點** 的多維坐標(int、long、float、double、geo_point …),**不存文本倒排**。
2. **結構** ?
? 依舊按 KD-Tree 方式遞歸切分維度; ?
? 每滿 1024 個點就寫成一個 **block**(順序磁盤頁),天然壓縮 & 緩存友好。 ?
? 所有葉子塊再建一個 **內存索引**(min-max 值 + 文件指針),查詢時先掃內存索引→定位少量磁盤塊→順序讀,幾乎無隨機 IO。
3. **支持的查詢** ?
? 范圍查詢:price ≥ 50 AND price < 100 ?
? 距離查詢:geo_distance 5 km 內 ?
? 最近鄰:knn_vector search ?
復雜度 **O(log N)**,且由于順序 IO,實際比 KD-Tree 在磁盤上快很多。
4. **優點** ?
? 磁盤順序讀友好 → SSD/HDD 都高效 ?
? 壓縮率極高 → 同樣數據體積 < 1/4 原始數組 ?
? 支持 **實時增刪改**(新文檔追加新 block,后臺合并)
5. **在 Elasticsearch 中的位置** ?
? 所有 `long`, `integer`, `double`, `date`, `ip`, `geo_point`, `geo_shape`, `dense_vector` 字段,**默認**就用 BKD 樹存維度數據; ?
? 因此 `range`, `geo_distance`, `knn` 查詢都走 BKD 而非倒排索引。
一句話: ?
**BKD 樹就是 Lucene 的“多維數值索引硬盤版”,讓范圍/距離/最近鄰查詢在磁盤上也像內存 KD-Tree 一樣快。**