企业自助建站模板,郴州市有几个县,成都推广系统,百度搜索风云榜明星Bulk 批量操作
#xff08;1#xff09; 比如#xff0c;我这里#xff0c;在$ES_HOME里#xff0c;新建一文件#xff0c;命名为requests。#xff08;这里为什么命名为request#xff0c;去看官网就是#xff09;在Linux里#xff0c;有无后缀没区别。 1 2 3 4 5…Bulk 批量操作
1 比如我这里在$ES_HOME里新建一文件命名为requests。这里为什么命名为request去看官网就是在Linux里有无后缀没区别。 1 2 3 4 5 6 7 8 9 10 [rootbackup01 elasticsearch-6.8.6]# vi requests {index:{_index:my_store,_type:my_index,_id:11}} {price:10,productID:1111} {index:{_index:my_store,_type:my_index,_id:12}} {price:20,productID:1112} {index:{_index:my_store,_type:my_index,_id:13}} {price:30,productID:1113} {index:{_index:my_store,_type:my_index,_id:14}} {price:40,productID:1114} 2执行命令 1 2 3 4 5 curl -PUT 192.168.80.200:9200/_bulk --data-binary requests; 或 curl -XPOST 192.168.80.200:9200/_bulk --data-binary requests; bulk的格式
{action:{metadata}}\n
{requstbody}\n (请求体)action(行为)包含create文档不存在时创建、update更新文档、index创建新文档或替换已用文档、delete删除一个文档。
create和index的区别如果数据存在使用create操作失败会提示文档已存在使用index则可以成功执行。
metadata(行为操作的具体索引信息)需要指明数据的_index、_type、_id。
示例
{delete:{_index:lib,_type:user,_id:1}}
批量添加
POST /lib2/books/_bulk
{index:{_id:1}} \\行为索引信息
{title:Java,price,55} \\请求体
{index:{_id:2}}
{title:Html5,price,45}
{index:{_id:3}}
{title:Php,price,35}
{index:{_id:4}}
{title:Python,price,50}//返回结果
{took: 60,error: false //请求是否出错返回false、具体的错误items: [//操作过的文档的具体信息{index:{_index: lib,_type: user,_id: 1,_version: 1,result: created, //返回请求结果_shards: {total: 1,successful: 1,failed: 0},_seq_no: 0,_primary_trem: 1status: 200}},...]
}
批量删除 删除的批量操作不需要请求体
POST /lib/books/_bulk
{delete:{_index:lib,_type:books,_id:4}} //删除的批量操作不需要请求体
{create:{_index:tt,_type:ttt,_id:100}}
{name:lisi} //请求体
{index:{_index:tt,_type:ttt}} //没有指定_idelasticsearch将会自动生成_id
{name:zhaosi} //请求体
{update:{_index:lib,_type:books,_id:4}} //更新动作不能缺失_id文档不存在更新将会失败
{doc:{price:58}} //请求体
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上的多个请求创建一个请求数组。
将这个请求数组序列化。