在 Elasticsearch 中,mget
(multiple get)API 用于一次性查询多个文档,显著减少了网络往返次数,提高了查询效率。以下是如何使用 mget
进行批量查询的实战步骤:
1. 请求格式
mget
请求采用 GET
方法,发送到 <index>/_mget
端点,请求体包含一个 docs
数组,每个元素是一个对象,描述要查询的文档:
{
"docs": [
{
"_index": "<index_name>",
"_type": "<type_name>", // 对于 Elasticsearch 7.x 及更高版本,此字段通常不需要,因为已经默认为 `_doc`
"_id": "<document_id>"
},
{
"_index": "<index_name>",
"_type": "<type_name>",
"_id": "<document_id>"
},
...
]
}
2. 示例请求
假设您要从 users
索引中批量查询用户 ID 为 1
、2
和 3
的文档,可以发出如下 mget
请求:
curl -X GET "http://localhost:9200/users/_mget" -H 'Content-Type: application/json' -d'
{
"docs": [
{ "_id": "1" },
{ "_id": "2" },
{ "_id": "3" }
]
}'
3. 响应格式
响应体包含一个 docs
数组,与请求中的顺序对应,每个元素是一个对象,包含查询结果:
_index
: 文档所在的索引名。_type
: 文档类型(对于 Elasticsearch 7.x 及更高版本,通常为_doc
)。_id
: 文档 ID。_version
: 文档版本号。found
: 布尔值,表示是否找到了对应 ID 的文档。如果为false
,则其他字段(如_source
)将缺失。_source
: (如果存在)包含查询到的文档原始内容的 JSON 对象。fields
: (可选)如果请求中指定了要返回的特定字段,它们将在此处列出。
示例响应:
{
"docs": [
{
"_index": "users",
"_type": "_doc",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"user_id": "1",
"username": "Alice",
"email": "alice@example.com",
"age": 30
}
},
{
"_index": "users",
"_type": "_doc",
"_id": "2",
"_version": 1,
"found": true,
"_source": {
"user_id": "2",
"username": "Bob",
"email": "bob@example.com",
"age": 35
}
},
{
"_index": "users",
"_type": "_doc",
"_id": "3",
"found": false
}
]
}
4. 注意事项
-
跨索引查询:
mget
请求可以同时查询多个索引中的文档,只需在docs
数组中为不同索引指定相应的_index
。 -
过滤返回字段:通过在请求体中添加
stored_fields
参数,可以指定返回哪些字段(而非整个_source
)。这对于减少网络传输量和提高查询性能特别有用,特别是当文档_source
中包含大量数据时。 -
版本控制:可以指定
version
和version_type
参数来处理并发更新情况下的版本控制。 -
错误处理:如果请求中的某些文档 ID 不存在或出现其他错误,Elasticsearch 仍会返回其他成功查询的结果。需要检查响应中每个文档的
found
字段来确定查询是否成功。
通过 mget
API,您可以高效地批量查询多个文档,节省网络资源并提高查询速度。在处理大量文档查询或需要定期批量获取数据的场景中,这是一种非常实用的技术。