Elasticsearch批量
-
批量查询
-
批量查询三种方式
# 可以多个index GET /_mget { "docs":[ { "_index":"product" ,"_id":1 } ,{ "_index":"product" ,"_id":2 } ] } # 同一个index GET /product/_mget { "docs":[ { "_id":1 } ,{ "_id":2 } ] } GET /product/_mget { "ids":[1,2] } # _source 不输出元数据或部分字段。 GET /product/_mget { "docs":[ { "_id":1 ,"_source":false } ,{ "_id":2 ,"_source":["name"] } ] } # _source 下的include 和 exclude include包含哪些字段 exclude排除哪些字段 GET /product/_mget { "docs":[ { "_id":1 ,"_source":{ "include":["price"] } } ,{ "_id":2 ,"_source":{ "exclude":["price"] } } ] }
-
注意关键词 docs 和 ids
- docs:主要用于index或者type不一样时包裹条件时用的。
-
- ids:主要用于简单id查询。
-
bulk批量增删改
-
语法格式:
POST /<index>/_bulk {"action": {"metadata"}} {"request body"}
-
action:
create:PUT /index/_create/id/,强制创建(是否制定id) delete:删除(lazy delete原理)。删除时不可以加request body。 index:可以是创建,也可以是全量替换 update:执行partial update(全量替换,部分替换)
metadata:index、type和_id
bulk一次最大处理多少数据量? bulk会把将要处理的数据载入内存中,过意数据量是有限制的,最佳的数据量不是一个确定的数,取决于你的硬件、索引及搜索负载。一般建议是1000~5000个文档,大小建议5-15M。默认不能超过100M,可在es配置文件修改。
-
bulk代码样例
# 加?filter_path=items.*.error 只显示失败的 POST /_bulk # 删除,不带request body { "delete": { "_index": "product2", "_id": "1" }} #强制插入,存在抛出异常 { "create": { "_index": "product2", "_id": "2" }} { "name": "_bulk create 2" } { "create": { "_index": "product2", "_id": "12" }} { "name": "_bulk create 12" } #插入,存在更新,不存在插入 { "index": { "_index": "product2", "_id": "3" }} { "name": "index product2 " } { "index": { "_index": "product2", "_id": "13" }} { "name": "index product2" } #仅更新 retry_on_conflict 乐观锁失败时重试次数,超过次数抛出异常 { "update": { "_index": "product2", "_id": "4","retry_on_conflict" : "3"} } { "doc" : {"test_field2" : "bulk test1"} }
-
ES并发冲突问题(悲观锁和乐观锁)
- 悲观锁:各种情况,都加锁,读写锁、行级锁、表级锁。使用简单,但是并发能力很低
- 乐观锁:并发能力高,操作麻烦,每次no-query操作都需要比对version