es:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html
下一篇:http://my.oschina.net/qiangzigege/blog/264428
内容:
mget让我们一次检索多个文档 bulk API让我们来做多个创建,索引,更新和删除请求。 这个非常有用。 bulk请求体有如下的格式: { action: { metadata }}\n { request body }\n { action: { metadata }}\n { request body }\n ... 需要注意两点: 1 每行要以'\n'结束,最后一行也是, 2 不能包含非转义换行符,影响解析。 action/metadata指定对文档执行什么操作。 action是以下几种之一:index,create,update,delete. metadata指定_index,_type,_id来让文档被索引,创建,更新和删除。 比如,一个删除的请求如下: { "delete": { "_index": "website", "_type": "blog", "_id": "123" }} 请求体包含了文档_source本身,文档包含的字段和值, 当行为为index和create时要求存在,你必须提供文档来索引。 行为为update时,也需要,比如doc,upsert,script等等。 删除则不需要request body. { "create": { "_index": "website", "_type": "blog", "_id": "123" }} { "title": "My first blog post" } 如果没有指定id,自动生成一个id. { "index": { "_index": "website", "_type": "blog" }} { "title": "My second blog post" } 看一个例子。 POST /_bulk { "delete": { "_index": "website", "_type": "blog", "_id": "123" }} { "create": { "_index": "website", "_type": "blog", "_id": "123" }} { "title": "My first blog post" } { "index": { "_index": "website", "_type": "blog" }} { "title": "My second blog post" } { "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} } { "doc" : {"title" : "My updated blog post"} } VIEW IN SENSE 响应如下: { "took": 4, "errors": false, "items": [ { "delete": { "_index": "website", "_type": "blog", "_id": "123", "_version": 2, "status": 200, "found": true }}, { "create": { "_index": "website", "_type": "blog", "_id": "123", "_version": 3, "status": 201 }}, { "create": { "_index": "website", "_type": "blog", "_id": "EiwfApScQiiy7TIKFxRCTw", "_version": 1, "status": 201 }}, { "update": { "_index": "website", "_type": "blog", "_id": "123", "_version": 4, "status": 200 }} ] }} ~~~~~~~~~~~~~~~~~~ 每个子请求都独立执行,所以一个失败不会影响别人, 如果任何一个请求失败,顶层的失败标识被设置为true, 错误细节会被报告。 POST /_bulk { "create": { "_index": "website", "_type": "blog", "_id": "123" }} { "title": "Cannot create - it already exists" } { "index": { "_index": "website", "_type": "blog", "_id": "123" }} { "title": "But we can update it" } 响应体里可以看到: 创建123失败,因为已经存在,但是后续的请求成功了。 { "took": 3, "errors": true, "items": [ { "create": { "_index": "website", "_type": "blog", "_id": "123", "status": 409, "error": "DocumentAlreadyExistsException [[website][4] [blog][123]: document already exists]" }}, { "index": { "_index": "website", "_type": "blog", "_id": "123", "_version": 5, "status": 200 }} ] } 这也意味着,批量请求不是原子的,不能用来实现事务。 每个请求独立处理, 不要重复自己 也许你在批量索引日志数据到同一个index里,同一个type, 为每个文档指定元数据是一种浪费,正如mget api所示, bulk请求接受/_index和/_index/_type在url里。 POST /website/_bulk { "index": { "_type": "log" }} { "event": "User logged in" } 你也仍然可以覆盖_index和_type在metadata行里。 但是它默认使用url里的值。 POST /website/log/_bulk { "index": {}} { "event": "User logged in" } { "index": { "_type": "blog" }} { "title": "Overriding the default type" } 多大是多大? 整个bulk请求需要被接受到请求的节点放在内存里,所以请求的数据越多, 其它请求可用的内存数量越少,有一个最佳大小, 超过那个大小,性能不会提高甚至下降。 这个最佳大小,尽管如此,不是一个固定数字,取决于你的硬件,文档大小和复杂度。 你的索引和查找负载,幸运的,很容易找到这个点。 尝试批量索引典型的文档,大小不断增加,当性能开始下降,说明这个数字太大了。 可以取一个[1000,5000]之间的数字作为开始。 同样也要关注你的请求的物理大小,1000个1kb的文档是不同于1000个1M的文档的。 一个比较好的bulk大小是5-15MB大小。