批量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}