首页/数据/NoSQL 速查/ids 按文档 ID 查询
Elasticsearch89 条

ids 按文档 ID 查询

ids 查询直接按内部 _id 取文档,绕过分词与评分,等价于按主键点查;跨索引批量按 ID 取文档更常见的是 _mget。

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

ids 查询是什么

ids 查询按文档 _id 精确取回文档,不走分词、不做相关性打分,语义等同于关系库的主键点查。它仍然是一次 search 请求,会经过分片查询与协调阶段;如果只是想按 ID 把若干文档取回来,_mget 更直接也更省开销。

基本信息

适用版本Elasticsearch 7.x / 8.x
查询写法{ "ids": { "values": ["1", "2"] } }
评分命中文档给统一常量分,不参与相关性排序
取数替代GET /_mget,或 GET /<index>/_doc/<id>
叠加能力可放进 bool 的 filter,与其他条件组合

典型使用场景

  • 按业务 ID 列表回填详情:把数据库里筛出的 ID 集合喂给 ES 取全文与字段
  • 与关系库结果对齐:用同一批主键在 ES 侧校验是否存在、字段是否一致
  • 与其他条件组合:bool.filter 里放 ids,再叠加范围或 term 条件做二次收敛
  • 重建索引后的抽检:按旧索引记录的 ID 在新索引里逐批核对文档内容
  • 只想取少数字段:配合 _source includes 减少网络往返的数据量

示例

示例
GET /my-index/_search
{
  "query": { "ids": { "values": ["1", "2"] } },
  "_source": ["title", "price"],        # 只取需要的字段,别整篇拉回
  "size": 10
}

GET /my-index/_search
{
  "query": {
    "bool": {
      "filter": [ { "ids": { "values": ["1", "2"] } },
                   { "range": { "stock": { "gt": 0 } } } ]
    }
  }
}

GET /_mget
{
  "docs": [
    { "_index": "my-index", "_id": "1" },
    { "_index": "my-index", "_id": "2" }
  ]
}

取数方式对照

需求推荐方式说明
按 ID 取少量文档_mget单请求多文档,直接读主分片,不走打分与排序
取文档同时要排序/聚合/高亮ids 查询走 search 路径,可继续叠 sort、aggs、highlight
上千个 ID 批量取分批提交查询体过大会被 http.max_content_length 拒绝
部分 ID 不存在ids 查询会静默忽略返回条数少于请求 ID 数,需自行核对
希望按传入顺序返回客户端重排ES 返回顺序与 values 数组顺序无关
构造查询时_ID 统一写成字符串最稳:JSON 里数字与字符串都能匹配到同一个文档,但脚本拼接时混用类型容易出现漏取,统一字符串可避免这类问题。
ids 查询给命中文档统一的常量分,默认顺序既不等于传入顺序也不是相关度顺序;要固定顺序必须显式指定 sort(如按某个字段或 _doc)。
_id 只在单个索引内唯一,同名 ID 在另一个索引里是另一篇文档;跨索引取数要在 _mget 的每个 doc 里显式写 _index。

易错点

  • 以为返回顺序等于 values 数组顺序,实际按分片与段顺序返回 → 需要顺序时客户端重排或显式 sort
  • 部分 ID 不存在时 ids 查询静默忽略不报错,回填逻辑不核对条数就会漏数据
  • 一次塞进上千个 ID 会撑大查询体,可能被 http.max_content_length 拒绝 → 按几百个一批分批提交
  • 纯取文档却用 ids 查询走 search 路径,白白付出分片打分与协调开销 → 改用 _mget
  • 把 _id 当成全局唯一键,跨索引复用同一 ID 集合取数会取到别的索引的文档

数据来源与参考

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