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。