ElasticSearch-batch-bulk-批处理
2025-01-22 08:19:30    717 字   
This post is also available in English and alternative languages.

ElasticSearch版本:6.5.0(点击跳转官方文档)

bulk api允许我们使用单一请求来实现多个文档的’create、index、update、delete’。


bulk 允许的行为:

行为解释
create当文档不存在时创建文档
index常见新文档或替换已有文档
update局部更新文档
delete删除一个文档

在执行上述动作时,必须指定文档的_index、_type、_id 这些元数据

注意!bulk的请求体有如下规范:

  1. 每行必须以"\n"符号结尾,包括最后一行。这些都是作为每行有效分离而做的标记

  2. 每一行的数据不能包含未被转义的换行符。避免干扰分析,这意味着,json格式不能美化。

请求报文

1
2
3
4
5
6
POST /_bulk
{"delete":{"_index": "demo","_type": "testDate","_id": "3"}}
{"create":{"_index": "megacorp","_type": "employee","_id": "999"}}
{"last_name":"ccc999","first_name":"999","age":"999"}
{"update":{"_index": "books","_type": "book","_id": "19"}}
{"doc":{"publish":"高等教育出版社666666"}}

注意:类似create、update之类,有文档参数的,换行在第二行写就行了。

请求报文做了些什么事?

  • 删除 - 索引demo、类型testDate、id为3 的文档

  • 创建 - 索引megacorp、类型employee、id为999 的文档,文档内容为第三行内容

  • 更新 - 索引books、类型book、id为19 的文档,更新内容为第五行内容。

响应报文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{
"took": 360,
"errors": false,
"items": [
{
"delete": {
"found": true,
"_index": "demo",
"_type": "testDate",
"_id": "3",
"_version": 2,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"status": 200
}
},
{
"create": {
"_index": "megacorp",
"_type": "employee",
"_id": "999",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true,
"status": 201
}
},
{
"update": {
"_index": "books",
"_type": "book",
"_id": "19",
"_version": 3,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"status": 200
}
}
]
}

确认下es中的结果

bulk-1

bulk-2

bulk-3

上面每个子请求都是独立执行的,所以一个子请求的错误并不影响其他请求。如果任何一个子请求失败,顶层error会标记为true,然后出现错误信息。bulk请求不是原子操作,他们不能实现事务。

如果 bulk 在同一个index、type下,就不用为每个文档指定相同的元数据了,写在url上面就行。