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

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

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


为什么要重写?

  1. **高级查询本身无法直接走索引**

例:`PrefixQuery("titl", "jav")` 并不知道前缀 `jav*` 到底对应哪些词项,需要先把索引里所有以 `jav` 开头的真实 term 找出来。

  1. **拆成原子查询后可走优化路径**
  • 倒排列表直接求并集/交集

  • 可利用跳表、压缩、缓存

  • 可以合并相邻 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)都会经历这一步;重写结果会影响后续缓存键、性能分析。

相关推荐
G皮T21 分钟前
【ELasticsearch】集群故障模拟方案(一):节点宕机、节点离线
大数据·elasticsearch·搜索引擎·集群·高可用·故障模拟·容错能力
Freed&2 小时前
部署 Kibana 8.2.2 可视化管理 Elasticsearch 8.2.2 集群
大数据·elasticsearch·搜索引擎
企鹅侠客4 小时前
2 安装 Docker 和 Jenkins:持续构建环境起步
docker·容器·jenkins·持续构建环境部署
risc1234568 小时前
【lucene】ByteBufferGuard
lucene
夜斗小神社11 小时前
【黑马SpringCloud微服务开发与实战】(九)elasticsearch基础
elasticsearch·spring cloud·微服务
六件套是我15 小时前
Jenkinsfile 报错
jenkins
Elastic 中国社区官方博客18 小时前
用于 UBI 的 Elasticsearch 插件:从搜索查询中分析用户行为
大数据·数据库·elasticsearch·搜索引擎·全文检索
wdfk_prog18 小时前
实战指南:如何将Git仓库中的特定文件夹及其历史完整迁移到另一个仓库
大数据·linux·运维·笔记·git·学习·elasticsearch
睡觉z1 天前
k8s日志收集
容器·kubernetes·jenkins
软件测试-阿涛1 天前
软件测试开发转型经验分享与职业发展指南
经验分享·python·功能测试·ci/cd·自动化·jenkins·持续集成