es之8:批量查询mget、批量增删改bulk,document的全量替换
1、批量查询的好处
就是一条一条的查询,比如说要查询100条数据,那么就要发送100次网络请求,这个开销还是很大的。如果进行批量查询的话,查询100条数据,就只要发送1次网络请求,网络请求的性能开销缩减100倍
2、批量查询 mget
可以说mget是很重要的,一般来说,在进行查询的时候,如果一次性要查询多条数据的话,那么一定要用batch批量操作的api,尽可能减少网络开销次数,可能可以将性能提升数倍,甚至数十倍,非常非常之重要。
先放点数据:
put /ecommerce/product/1 { "a":"1", "b":"2" } put /ecommerce/product/2 { "a":"3", "b":"4" }
批量查询:
GET /_mget { "docs":[ { "_index":"ecommerce", "_type":"product", "_id":1 }, { "_index":"ecommerce", "_type":"product", "_id":2 } ] }
结果:
{ "docs" : [ { "_index" : "ecommerce", "_type" : "product", "_id" : "1", "_version" : 1, "_seq_no" : 0, "_primary_term" : 1, "found" : true, "_source" : { "a" : "1", "b" : "2" } }, { "_index" : "ecommerce", "_type" : "product", "_id" : "2", "_version" : 1, "_seq_no" : 0, "_primary_term" : 1, "found" : true, "_source" : { "a" : "3", "b" : "4" } } ] }
get ecommerce/_mget { "docs":[ { "_type":"product", "_id":1 }, { "_type":"product", "_id":2 } ] }
GET /ecommerce/product/_mget { "ids":[1,2,3,4] }
3、批量增删改 bulk
(2)create:PUT /index/type/id/_create,强制创建
(3)index:普通的put操作,可以是创建文档,也可以是全量替换文档
(4)update:执行的partial update操作
注意:
(1)action所在json和data所在的json要换行,当action为delete时没有data
POST /_bulk {"delete":{"_index":"test_index","_type":"test_type","_id":"3"}} {"create":{"_index":"test_index","_type":"test_type","_id":"13"}} {"test_field":"replaced test13"} {"index":{"_index":"test_index","_type":"test_type","_id":"2"}} {"test_field":"replaced test2"} {"update":{"_index":"test_index","_type":"test_type","_id":"1","_retry_on_conflict":3}} {"doc":{"test_field2":"bulk test 1"}}
bulk request会加载到内存里,如果太大的话,性能反而会下降,因此需要反复尝试一个最佳的bulk size。一般从1000~5000条数据开始,尝试逐渐增加。另外,如果看大小的话,最好是在5~15MB之间。
1、document的全量替换
(1)语法与创建文档是一样的,如果document id不存在,那么就是创建;如果document id已经存在,那么就是全量替换操作,替换document的json串内容
(2)document是不可变的,如果要修改document的内容,第一种方式就是全量替换,直接对document重新建立索引,替换里面所有的内容
(3)es会将老的document标记为deleted,然后新增我们给定的一个document,当我们创建越来越多的document的时候,es会在适当的时机在后台自动删除标记为deleted的document
2、document的强制创建
(1)创建文档与全量替换的语法是一样的,有时我们只是想新建文档,不想替换文档,如果强制进行创建呢?
(2)PUT /index/type/id?op_type=create 或者 PUT /index/type/id/_create
3、document的删除
(1)DELETE /index/type/id
(2)不会理解物理删除,只会将其标记为deleted,当数据越来越多的时候,在后台自动删除