一次请求跑多个查询
_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 | 错误信息 | 单个失败不影响其他结果 |
每个查询体后面必须换行,头行与体行错位会让整批解析失败;用命令行拼接时注意最后一行也要以换行结尾。
单个请求内查询数量过多会占用协调与线程池资源,仪表盘场景建议控制在几十个以内,再多的看板应拆成多次请求。