【Lucene/Elasticsearch】**Query Rewrite** 机制

这段话描述的是 Lucene/Elasticsearch 的 **Query Rewrite** 机制,核心一句话:

> **把“高级”或“逻辑”查询(如 PrefixQuery、WildcardQuery、RangeQuery)在真正执行前,拆成最底层的、可直接倒排索引查的“原子查询”(TermQuery、PointRangeQuery 等)。**

---

### 为什么要重写?

1. **高级查询本身无法直接走索引**  
   例:`PrefixQuery("titl", "jav")` 并不知道前缀 `jav*` 到底对应哪些词项,需要先把索引里所有以 `jav` 开头的真实 term 找出来。

2. **拆成原子查询后可走优化路径**  
   - 倒排列表直接求并集/交集  
   - 可利用跳表、压缩、缓存  
   - 可以合并相邻 TermQuery 为更高效的 BooleanQuery

---

### 举个完整流程

```text
用户写的查询            →   重写后的查询
------------------------------------------------
PrefixQuery("title", "jav")   →   BooleanQuery
                                 ├── TermQuery("java")
                                 ├── TermQuery("javascript")
                                 └── TermQuery("javaw")
```

- 重写由 `Query.rewrite(IndexReader)` 触发,发生在 **搜索执行早期**(QueryPhase 之前)。  
- 对上层透明:用户看到的仍是原查询,内部已变成“可执行的原子查询”。

---

### Elasticsearch 中的体现

- 在 Profile API 里能看到 `rewrite_time` 指标。  
- 复杂查询(wildcard、range、geo、script)都会经历这一步;重写结果会影响后续缓存键、性能分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值