Elasticsearch 批量操作详解
一、批量检索(mget)
在分布式环境中,频繁发起单次查询会产生显著的网络开销。Elasticsearch 提供了 mget 接口,允许一次请求获取多个文档,有效降低网络延迟。
准备示例数据
PUT /user_info/_doc/u100
{
"username": "alice",
"score": 85
}
PUT /user_info/_doc/u101
{
"username": "bob",
"score": 92
}
PUT /user_info/_doc/u102
{
"username": "carol",
"score": 78
}
基础用法
完整格式需指定索引、类型和文档 ID:
GET /_mget
{
"docs": [
{ "_index": "user_info", "_type": "_doc", "_id": "u100" },
{ "_index": "user_info", "_type": "_doc", "_id": "u101" }
]
}
若目标索引一致,可简化路径:
GET /user_info/_mget
{
"docs": [
{ "_type": "_doc", "_id": "u100" },
{ "_type": "_doc", "_id": "u101" }
]
}
若类型也相同,可进一步简化为 ID 数组:
GET /user_info/_doc/_mget
{
"ids": ["u100", "u101", "u102"]
}
二、批量写入(bulk)
当需要高效导入日志流或大规模数据时,bulk API 支持单次请求执行多次索引、更新或删除操作。
核心特性
- 每个子操作独立执行,单条失败不影响其他操作
- 非原子性,不具备事务特性
- 请求体需严格遵循换行分隔格式
请求格式规范
每行以换行符(\n)结尾,结构如下:
{action_line}
{optional_source_line}
支持的 action 类型
| 操作 | 行为说明 |
|---|---|
create | 仅当文档不存在时创建 |
index | 创建新文档或完全替换已有文档 |
update | 对文档执行局部更新 |
delete | 移除指定文档(无请求体) |
完整示例
POST /_bulk
{ "delete": { "_index": "article", "_type": "_doc", "_id": "a001" }}
{ "create": { "_index": "article", "_type": "_doc", "_id": "a001" }}
{ "title": "Elasticsearch 入门指南", "author": "team" }
{ "index": { "_index": "article", "_type": "_doc", "_id": "a002" }}
{ "title": "分布式系统原理", "author": "lab" }
{ "update": { "_index": "article", "_type": "_doc", "_id": "a003", "_retry_on_conflict": 3 }}
{ "doc": { "views": 1500 }}
性能优化要点
整个 bulk 请求会被加载到接收节点的内存中,过大的请求会挤压其他操作的内存空间。建议通过实测寻找最佳批次规模:
- 文档数:通常以 1,000–5,000 条为起始点
- 物理大小:单批次控制在 5–15 MB 左右
- 若单条文档体积大,适当减少批次中的文档数量
可通过逐步增加批量大小并监控吞吐量和延迟,找到性能拐点作为实际配置依据。