ElasticSearch学习

文章40 |   阅读 18842 |   点赞0

来源:https://blog.csdn.net/ywl470812087/category_9621251.html

Bulk API实现批量操作

x33g5p2x  于2021-12-19 转载在 其他  
字(4.4k)|赞(0)|评价(0)|浏览(372)

Bulk 批量操作

(1) 比如,我这里,在$ES_HOME里,新建一文件,命名为requests。(这里为什么命名为request,去看官网就是)在Linux里,有无后缀没区别。

| <br>1<br><br>2<br><br>3<br><br>4<br><br>5<br><br>6<br><br>7<br><br>8<br><br>9<br><br>10<br> | <br>[root@backup01 elasticsearch-6.8.6]# ``vi requests<br><br>  <br><br>{``"index"``:{``"_index"``:``"my_store"``,``"_type"``:``"my_index"``,``"_id"``:``"11"``}}<br><br>{``"price"``:10,``"productID"``:``"1111"``}<br><br>{``"index"``:{``"_index"``:``"my_store"``,``"_type"``:``"my_index"``,``"_id"``:``"12"``}}<br><br>{``"price"``:20,``"productID"``:``"1112"``}<br><br>{``"index"``:{``"_index"``:``"my_store"``,``"_type"``:``"my_index"``,``"_id"``:``"13"``}}<br><br>{``"price"``:30,``"productID"``:``"1113"``}<br><br>{``"index"``:{``"_index"``:``"my_store"``,``"_type"``:``"my_index"``,``"_id"``:``"14"``}}<br><br>{``"price"``:40,``"productID"``:``"1114"``}<br> |

(2)执行命令

| <br>1<br><br>2<br><br>3<br><br>4<br><br>5<br> | <br>curl  -PUT  ``'192.168.80.200:9200/_bulk'   --data-binary @requests;<br><br><br><br>  curl  -XPOST  ``'192.168.80.200:9200/_bulk'   --data-binary @requests;<br> |

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": 1
           "status": 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"}} //没有指定_id,elasticsearch将会自动生成_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上的多个请求,创建一个请求数组。
将这个请求数组序列化。

相关文章