_mget 是干什么的
multi get 在单个请求里取回多篇文档,支持跨索引、支持按字段裁剪 _source。相比循环单文档 GET,它把多次网络往返压成一次,是缓存里只有 ID、需要批量补详情的标准手段。返回的 docs 数组与请求顺序严格一一对应,缺失文档以占位形式保留。
基本信息
| 接口 | GET /_mget 或 GET /<index>/_mget |
|---|---|
| 请求结构 | docs 数组逐条写 _index / _id / _source |
| 索引内简写 | 在 <index>/_mget 里只给 ids 数组 |
| 返回 | docs 与请求同序,缺失文档带 found: false |
| 适用版本 | Elasticsearch 5.x 起接口稳定 |
示例
示例
# 跨索引批量取三篇文档,单篇可单独裁剪字段
GET /_mget
{
"docs": [
{ "_index": "my-index", "_id": "1", "_source": ["title"] },
{ "_index": "my-index", "_id": "2" },
{ "_index": "other-index", "_id": "9" }
]
}
# 同一索引内的简写:只给 ids
GET /my-index/_mget
{ "ids": ["1", "2", "3"] }典型使用场景
- 缓存或消息队列里只有文档 ID,需要批量补回详情
- 跨索引取数:一次请求分别取不同索引上的文档
- 抽样核对:按 ID 列表取回线上文档内容做数据比对
- 修复验证:批量读回结果确认修复脚本是否生效
- 降低往返:替代逐条 GET,减少客户端与服务端的连接开销
返回结构读法
| 返回项 | 含义 | 注意 |
|---|---|---|
| _index / _id | 文档定位 | 按 ID 取是实时的,不受 refresh 影响 |
| found | 文档是否存在 | false 表示文档不存在或已被删除 |
| _source | 文档内容 | 请求里指定 _source 可裁剪字段 |
| docs 数组 | 结果集合 | 与请求同序,缺失项以占位保留 |
与 search 不同,_mget 走按 ID 的实时读取通道:刚写入、还没等到 refresh 的文档也能立即取到,验证写入成功时优先用它。
单次请求的文档条数建议控制在几百条量级;再大时改用 terms 查询按 ID 批量检索,避免一个请求在协调阶段占用过多资源。
为什么比循环 GET 快
逐条 GET 的代价主要在往返次数与路由开销:每条请求都要单独路由到目标分片再回传结果,条数一多,总耗时基本与条数成正比。_mget 会把请求里的文档按目标分片分组,在一次请求内合并读取,再把各分片结果按原顺序拼回,因此同样条数下总耗时明显更低。它还允许给每篇文档单独指定 _source 裁剪,所以"不同页取不同字段"的批量场景也能一次完成。
批量取详情时如果只关心少数几个字段,就在每篇文档的 _source 里分别列出;跨索引请求里字段结构可能不同,脚本解析时不要假设所有返回文档长一个样子。