首页/数据/NoSQL 速查/_msearch 一次提交多个查询
Elasticsearch89 条

_msearch 一次提交多个查询

multi search 用 NDJSON 在单个请求里执行多个查询:头部行指定索引与参数,紧随一行查询体,成对出现;适合仪表盘同时拉取多组数据。

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

一次请求跑多个查询

_msearch 用 NDJSON 在单个请求里执行多个查询:每个查询由两行组成,第一行是头(指定索引与检索参数,可为空对象),第二行是查询体,两行成对出现且顺序固定。它适合仪表盘一次拉回多组数据,也适合把互不相关的检索合并成一次往返。

为什么用批量而不是串行

结果放在 responses 数组里,与请求顺序一一对应;某个查询失败只影响自己那一项,不会让整批请求失败。这让仪表盘可以在一次往返里拿到多组结果,也便于统一设置超时、路由与压缩,客户端串行发多个请求则要付出多次连接与等待的代价。

基本信息

接口GET 或 POST /_msearch
格式头行 {"index": "..."} 加一行查询体,成对且顺序固定
返回responses 数组与请求顺序一一对应
头行参数index、search_type、routing、preference 等
适用版本Elasticsearch 5.x 起接口稳定

示例

示例
POST /_msearch
{ "index": "my-index" }
{ "query": { "match": { "title": "a" } }, "size": 3 }
{ "index": "my-index" }
{ "query": { "term": { "status": "open" } }, "size": 0, "aggs": { "c": { "value_count": { "field": "id" } } } }

# 空头行表示使用默认索引
{}
{ "query": { "match_all": {} }, "size": 1 }

# 每个 JSON 之后必须有换行,最后一行也要以换行结束

典型使用场景

  • 仪表盘:一次拉回多条曲线或统计卡片的数据
  • 批量核对:同一条件在不同索引上各跑一遍,比对结果差异
  • 混合查询:文档检索与聚合统计打包成一次请求
  • 减少往返:客户端与服务端跨区域时,合并请求能明显省时间
  • 统一参数:在头行里给整批查询指定路由或偏好

请求与返回结构

位置内容注意
头行{"index": "..."} 或 {} 空对象表示使用默认索引
体行完整查询 DSL只做聚合时可只写 size 0
responses结果数组与请求顺序一一对应
单项 error错误信息单个失败不影响其他结果
每个查询体后面必须换行,头行与体行错位会让整批解析失败;用命令行拼接时注意最后一行也要以换行结尾。
单个请求内查询数量过多会占用协调与线程池资源,仪表盘场景建议控制在几十个以内,再多的看板应拆成多次请求。

易错点

  • 头行与体行错位或缺少换行会让整批解析失败,报错通常不会指出具体是哪一行
  • 单请求内查询数量过多会占用协调与线程池资源,仪表盘建议控制在几十个以内
  • 空头行 {} 表示使用默认索引,要指定索引必须写在头行里,混用 URI 会得到非预期结果
  • 单个查询失败只在对应的 responses 项里返回 error,不逐项检查状态会静默丢掉一部分数据

数据来源与参考

  • Elasticsearch Guide: Multi search API
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌