首页/数据/NoSQL 速查/_mget 批量读取文档
Elasticsearch89 条

_mget 批量读取文档

multi get 一次请求取多篇文档,支持跨索引与 _source 过滤;相比循环单文档 GET 大幅减少网络往返,是批量补数据场景的基础接口。

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

_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 里分别列出;跨索引请求里字段结构可能不同,脚本解析时不要假设所有返回文档长一个样子。

易错点

  • 缺失文档以 found: false 占位保留,解析时按下标对齐而不是过滤掉,否则结果会与请求错位
  • 索引名不存在会让整批请求报错,这与文档不存在(found: false)是两种结果,代码要分别处理
  • 单请求塞入过多 ID 会拉长协调阶段耗时,几百条以上建议改用 terms 检索批量取
  • _mget 只能按 _id 定位,不能按字段条件筛选,条件过滤还得走 search

数据来源与参考

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