在 Lucene/Elasticsearch 中,**BKD 樹只負責“多維數值”字段**。其余類型仍走傳統的 **倒排索引** 或專用格式:
| 數據類型(ES 字段類型) | 底層索引結構 | 說明 |
|---|---|---|
| `text`、`keyword`(字符串) | **倒排索引 + 正排 doc values** | 分詞或不分詞的倒排列表 |
| `boolean` | **倒排索引**(T/F 兩個 term) | 簡單布爾過濾 |
| `binary` | **DocValues(行存)** | 原始字節,僅存儲/檢索,不索引 |
| `object`、`nested`、`flattened` | **子字段遞歸索引** | 內部仍是倒排/BKD 組合 |
| `range`(整數/日期/浮點范圍) | **BKD 樹** | 雖然類型叫 range,底層仍存成“低維 BKD 點” |
| `token_count` | **倒排索引** | 實際上是對字符串計數后存數值 |
| `completion`、`search_as_you_type` | **專用 FST** | 用于前綴/補全,不走倒排 |
一句話總結: ?
**除了字符串、布爾、二進制等“非數值/非地理/非向量”字段,其余多維數值類(含 range)默認都走 BKD;其余走倒排或專用結構。**
詞典之上再建 FST(Finite State Transducer) 二級索引,壓縮前綴后綴,實現毫秒級前綴/模糊查詢 先查哪個索引呢?
查詢順序是 **先查 FST,再查倒排表**:
1. **FST 二級索引**(內存常駐) ?
? 先根據用戶輸入的前綴或模糊模式,在 **FST** 里快速定位到 **所有候選 term** 的起止位置。 ?
? FST 只占用詞典前/后綴壓縮后的字節數組,**毫秒級**就能拿到候選 term 列表。
2. **倒排表(Postings)** ?
? 拿到候選 term 后,再跳到 **倒排索引** 的相應偏移量,讀出每個 term 的文檔號列表、位置等信息。 ?
? 這一步是磁盤或 mmap 讀取,**條數多時可能涉及順序掃描**。
---
### ? 一句話總結 ?
> **前綴/模糊查詢時,先通過內存里的 FST 秒級篩出候選詞,再去倒排表里取真正的文檔集合。**