首页/数据/NoSQL 速查/_validate/query 校验查询语法
Elasticsearch89 条

_validate/query 校验查询语法

_validate/query 提前校验查询结构是否合法并可返回重写后的执行计划(explain),适合在工具链里做查询自检,避免线上才暴露语法错误。

NoSQL 速查数据更新于 2026-10-13

_validate/query 是什么

_validate/query 在不读取数据的前提下校验查询结构是否合法,带 explain 参数时还会返回重写后的执行计划,用来在查询生成器、查询模板上线前先自检,避免语法错误留到线上才暴露。它的开销远低于真正执行一次检索,适合放在生成逻辑的测试环节或在排障时确认查询写法是否被正确理解。要注意它只校验结构:字段名写错仍可能返回合法,只是查不到数据。

基本信息

接口GET /<index>/_validate/query 或 /_validate/query?explain=true
返回valid 布尔值;带 explain 时返回分片与重写后的查询
开销不读取数据,明显低于真实检索
局限不校验字段是否存在与类型是否匹配
适用查询生成器、查询模板与版本升级前的自检

典型使用场景

  • 查询生成器自检:拼接出的 DSL 在发送前先校验一次结构
  • 模板回归:改动查询模板后跑一遍校验,避免语法回退
  • 确认查询理解:对比 explain 返回的重写结果与预期是否一致
  • 升级前检查:提前发现新旧版本对某类语法的支持差异
  • 排障辅助:报错时用校验接口区分是语法问题还是数据问题

两种用法

两种用法
GET /my-index/_validate/query?explain=true
{
  "query": { "match": { "title": "test" } }
}

# 只看合法性,不返回执行计划
GET /my-index/_validate/query
{
  "query": { "bool": { "must": [ { "term": { "status": "open" } } ] } }
}

返回内容读法

字段含义读法
valid结构是否合法false 时结合报错定位语法问题
_shards分片执行情况带 explain 时返回
explanations各分片的计划看 rewritten 是否符合预期
rewritten重写后的查询判断查询是否被正确理解
error报错信息定位非法字段或类型
校验通过只代表结构合法。字段名写错或类型不匹配时仍可能返回 valid 为 true 却查不到数据,字段层面的核对要用 mapping 或 field_caps 接口。
带 explain 的输出会执行查询重写,空索引与有数据索引的计划可能不同,评估计划时请用有代表性的索引。

易错点

  • 校验通过只代表结构合法,字段名写错仍可能返回 true 但没有命中
  • 带 explain 的输出会做查询重写,空索引与有数据的索引计划可能不同
  • 把 validate 当性能测试:它不执行检索,结果无法反映真实耗时
  • 在超大索引上对复杂查询反复校验,重写阶段仍会消耗集群资源

数据来源与参考

  • Elasticsearch Guide: Validate API
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌