ElasticSearch 使用Bulk API 实现批量操作

使用Bulk API 实现批量操作:

Bluk的格式:

{
	action:{
		metadata
	}
	{
		requestbody
	}
}

action(行为):
create: 文档不存在时,创建
update:更新文档
index :创建新文档,或者替换已经有的文档
delete 删除一个文档

metadata: _index,_type,_id

create 和 index 的区别

如果数据存在,使用create 操作失败,会提示文档已经存在,使用 index 就可以成功执行
示例:

POST /_bulk
{"index":{"_index":"store","_type":"product","_id":"11"}}
{"price":10,"productID":"1111"}
{"index":{"_index":"store","_type":"product","_id":"12"}}
{"price":20,"productID":"1112"}
{"index":{"_index":"store","_type":"product","_id":"13"}}
{"price":30,"productID":"1113"}
{"index":{"_index":"shop","_type":"item","_id":"14"}}
{"price":40,"productID":"1114"}

或指定索引/类型下批量:

POST yule/user/_bulk
{"index":{"_id":1}}
{"name":"yangmi","age":33,"works":"shendiaoxialv"}
{"index":{"_id":2}}
{"name":"yuanquan","age":38,"works":"zhongguojizhang"}
{"index":{"_id":3}}
{"name":"zhengshuang","age":31,"works":"weiweiyixiao"}

批量删除:

post /_bulk
{"delete":{"_index":"store","_type":"product","_id":"13"}}}

批量更新:

POST /_bulk
{"update":{"_index":"store","_type":"product","_id":"12"}}
{"doc":{"price":21}}

注意点:

bluk一次最大处理多少数据量
bulk会将要处理的数据载入内存中,所以数据量是有限的,最佳的数据两不是一个确定的数据,它取决于你的硬件,你的文档大小以及复杂性,你的索引以及搜索的负载。

一般建议是1000-5000个文档,大小建议是5-15MB,默认不能超过100M,可以在es的配置文件(即$ES_HOME下的config下的elasticsearch.yml)中,bulk的线程池配置是内核数+1。

bulk批量操作的json格式解析
bulk的格式:
{action:{metadata}}\n
{requstbody}\n (请求体)

不用将其转换为json对象,直接按照换行符切割json,内存中不需要json文本的拷贝。
对每两个一组的json,读取meta,进行document路由。
直接将对应的json发送到node上。
为什么不使用如下格式:

[{"action":{},"data":{}}]
1
这种方式可读性好,但是内部处理就麻烦;耗费更多内存,增加java虚拟机开销

将json数组解析为JSONArray对象,在内存中就需要有一份json文本的拷贝,另外还有一个JSONArray对象。
解析json数组里的每个json,对每个请求中的document进行路由。
为路由到同一个shard上的多个请求,创建一个请求数组。
将这个请求数组序列化。

_mget批量查询:

GET yule/user/_mget
{
  "ids":[1,2,3]
}

可以批量获取不通索引类型数据:

GET /_mget
{
  "docs":[
     {
        "_index": "store",
        "_type": "product",
        "_id": "11"
     },
     {
        "_index": "yule",
        "_type": "user",
        "_id": "1"
     }
  ]
}

可以指定具体的字段

GET /_mget
{
  "docs":[
     {
        "_index": "yule",
        "_type": "user",
        "_id": "1",
        "_source": "works"
     },
     {
        "_index": "yule",
        "_type": "user",
        "_id": "2",
        "_source": ["age","works"]
     }
  ]
}
原创文章 317 获赞 416 访问量 112万+

猜你喜欢

转载自blog.csdn.net/u014082714/article/details/102589997