Elasticsearch实现批量更新



1 bulk

前面我们已经提到批量查询 mget ,那么如果我们想要批量导入数据呢?当然也有解决方法,那就是我们现在要讲的 bulk 。 bulk 允许我们使用单一请求来实现多个文档的 create 、 index 、 update 或 delete ,这在我们平时的应用中是很重要的。


2 bulk 语法

bulk API 对 JSON 的语法有严格的要求,具体要求:bulk 中每一个操作要两个 JSON 串,每个 JSON 串不能换行,只能放在同一行,而 JSON 串和 JSON 串之间,必须有一个换行。

bulk 允许我们批量执行不同的操作,常用操作如下:

  • delete:删除文档,delete比较特殊,只需1个 JSON 串即可;
  • create:相当于 PUT /index/type/id/_create,只不过是强制创建;
  • index:普通的 PUT 操作,可以是创建文档,也可以是全量替换文档;
  • update:执行 partial update 操作。

语法格式如下:

POST /_bulk
{ 
  {"action": {"metadata"}}      //一个操作需两个JSON,delete除外
  {"data"}
}

举个栗子:

我们要创建一个文档,其中 index 为 “test_index” , type 为 “test_type” , id 为 1 ; field 有两个,分别是 test_field1 为 “test1” 、 test_field2 为 “test2” 。

POST /_bulk
{"index": {"_index": "test_index", "_type", "test_type", "_id": "1"}}
{"test_field1": "test1", "test_field2": "test2"} 

或者,我们想在一次请求中执行 delete、create、index、update 操作。

POST /_bulk
{ "delete": { "_index": "test_index", "_type": "test_type", "_id": "3" }}       //delete操作
{ "create": { "_index": "test_index", "_type": "test_type", "_id": "12" }}      //create操作
{ "test_field":    "test12" }
{ "index":  { "_index": "test_index", "_type": "test_type", "_id": "2" }}       //index操作
{ "test_field":    "replaced test2" }
{ "update": { "_index": "test_index", "_type": "test_type", "_id": "1", "_retry_on_conflict" : 3} } //update操作
{ "doc" : {"test_field2" : "bulk test1"} }

值得注意的是, bulk 操作中,任意一个操作失败,不会影响其他操作,但是会在返回结果显示异常日志。


3 bulk size 的最佳大小

因为 bulk request 会被加载到内存中,所以如果 bulk 请求太大的话,性能反而会下降。因此,需要选择一个合适的 bulk size ,不能太大也不能太小。一般可从 1000~5000 条数据开始,尝试逐渐增加,而大小最好是在 5~15MB 之间。


参考资料:http://www.roncoo.com/article/detail/128304


 
comments powered by Disqus