批量API - shuiyuebingdian/ElasticSearch GitHub Wiki
批量API使在单个API调用中执行许多索引/删除操作成为可能。这样可以大大提高索引速度。 REST API端点为/_bulk,并且期望使用以下以换行符分隔的JSON(NDJSON)结构:
action_and_meta_data \ n
optional_source \ n
action_and_meta_data \ n
optional_source \ n
....
action_and_meta_data \ n
optional_source \ n
注意:数据的最后一行必须以换行符结尾\n。每个换行符前面都可以有一个回车符\r。向此端点发送请求时, Content-Type标头应设置为application/x-ndjson。
可能的操作有index,create,delete和update。 index和create操作的下一行需要提供源,并且具有与op_type标准索引API 的参数相同的语义(即,如果已经存在具有相同索引和类型的文档,则创建将失败,而索引将根据需要添加或替换文档) 。delete不需要下一行的源,并且具有与标准delete API相同的语义。 update期望在下一行指定部分doc,upsert和script及其选项。
如果要提供文本文件输入curl,则必须使用 --data-binary标志而不是-d。后者不保留换行符。例:
$ cat requests
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }
$ curl -s -H "Content-Type: application/x-ndjson" -XPOST localhost:9200/_bulk --data-binary "@requests"; echo
{"took":7, "errors": false, "items":[{"index":{"_index":"test","_type":"type1","_id":"1","_version":1,"result":"created","forced_refresh":false}}]}
由于此格式使用文字\n的定界符,因此请确保JSON动作和源不用漂亮的格式。这是正确的批量命令序列的示例:
POST _bulk
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_type" : "type1", "_id" : "2" } }
{ "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "type1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
此批量操作的结果是:
{
"took": 30,
"errors": false,
"items": [
{
"index": {
"_index": "test",
"_type": "type1",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true,
"status": 201
}
},
{
"delete": {
"found": false,
"_index": "test",
"_type": "type1",
"_id": "2",
"_version": 1,
"result": "not_found",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"status": 404
}
},
{
"create": {
"_index": "test",
"_type": "type1",
"_id": "3",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true,
"status": 201
}
},
{
"update": {
"_index": "test",
"_type": "type1",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"status": 200
}
}
]
}
端点是/_bulk,/{index}/_bulk和{index}/{type}/_bulk。提供索引或索引/类型后,默认情况下将在未显式提供索引的批量商品上使用它们。
关于格式的注释。这里的想法是使处理尽可能快。由于某些操作将重定向到其他节点上的其他分片,因此仅action_meta_data在接收节点侧进行解析。
使用此协议的客户端库应尝试并努力在客户端执行类似的操作,并尽可能减少缓冲。
对批量操作的响应是一个大型JSON结构,其中包含执行的每个操作的单独结果。单个操作的失败不会影响其余操作。
单个批量调用中没有“正确”的操作数量。您应该尝试不同的设置,以找到适合您特定工作负载的最佳大小。
如果使用HTTP API,请确保客户端不发送HTTP块,因为这会降低速度。
版本控制
每个批量商品都可以使用_version/ version字段来包含版本值 。它根据_version映射自动遵循索引/删除操作的行为。它还支持version_type/ _version_type(请参阅版本)
路由
每个批量项都可以使用_routing/ routing字段包含路由值 。它根据_routing映射自动遵循索引/删除操作的行为。
父级
每个批量项都可以使用_parent/ parent 字段包含父值。它基于_parent/ _routing映射自动遵循索引/删除操作的行为。
等待活动碎片
进行批量调用时,可以将wait_for_active_shards 参数设置为在开始处理批量请求之前,要求最少数量的分片副本处于活动状态。有关更多详细信息和用法示例,请参见 此处。
刷新
控制何时可以看到此请求所做的更改。请参阅 刷新。
更新资料
使用update操作时,_retry_on_conflict可以将其用作操作本身(而不是额外的有效负载行)中的字段,以指定在版本冲突的情况下应重试更新的次数。
的update动作有效载荷,支持下面的选项:doc (部分文档), ,,upsert 和。有关这些选项的详细信息,请参阅更新文档。更新动作示例:
POST _bulk
{ "update" : {"_id" : "1", "_type" : "type1", "_index" : "index1", "_retry_on_conflict" : 3} }
{ "doc" : {"field" : "value"} }
{ "update" : { "_id" : "0", "_type" : "type1", "_index" : "index1", "_retry_on_conflict" : 3} }
{ "script" : { "inline": "ctx._source.counter += params.param1", "lang" : "painless", "params" : {"param1" : 1}}, "upsert" : {"counter" : 1}}
{ "update" : {"_id" : "2", "_type" : "type1", "_index" : "index1", "_retry_on_conflict" : 3} }
{ "doc" : {"field" : "value"}, "doc_as_upsert" : true }
{ "update" : {"_id" : "3", "_type" : "type1", "_index" : "index1", "_source" : true} }
{ "doc" : {"field" : "value"} }
{ "update" : {"_id" : "4", "_type" : "type1", "_index" : "index1"} }
{ "doc" : {"field" : "value"}, "_source": true}