上篇文章介绍了在es里面批量读取数据的方法mget,本篇我们来看下关于批量写入的方法bulk。

bulk api可以在单个请求中一次执行多个索引或者删除操作,使用这种方式可以极大的提升索引性能。

bulk的语法格式是:

action and meta_data \n
optional source \naction and meta_data \n
optional source \naction and meta_data \n
optional source \n

从上面能够看到,两行数据构成了一次操作,第一行是操作类型可以index,create,update,或者delete,第二行就是我们的可选的数据体,使用这种方式批量插入的时候,我们需要设置的它的Content-Type为application/json。

针对不同的操作类型,第二行里面的可选的数据体是不一样的,如下:

(1)index 和 create  第二行是source数据体
(2)delete 没有第二行
(3)update 第二行可以是partial doc,upsert或者是script

我们可以将我们的操作直接写入到一个文本文件中,然后使用curl命令把它发送到服务端:

一个requests文件内容如下:

{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }
{ "field1" : "value1" }

发送命令如下:

curl -s -H "Content-Type: application/x-ndjson" -XPOST localhost:9200/_bulk --data-binary "@requests"; echo

响应结果如下:

{"took":7, "errors": false, "items":[{"index":{"_index":"test","_type":"_doc","_id":"1","_version":1,"result":"created","forced_refresh":false}}]}

注意由于我们每行必须有一个换行符,所以json格式只能在一行里面而不能使用格式化后的内容,下面看一个正确的post bulk的请求数据体:

{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } }
{ "create" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "_doc", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }

bulk请求的返回操作的结果也是批量的,每一个action都会有具体的应答体,来告诉你当前action是成功执行还是失败 :

{"took": 30,"errors": false,"items": [{"index": {"_index": "test","_type": "_doc","_id": "1","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"status": 201,"_seq_no" : 0,"_primary_term": 1}},{"delete": {"_index": "test","_type": "_doc","_id": "2","_version": 1,"result": "not_found","_shards": {"total": 2,"successful": 1,"failed": 0},"status": 404,"_seq_no" : 1,"_primary_term" : 2}},{"create": {"_index": "test","_type": "_doc","_id": "3","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"status": 201,"_seq_no" : 2,"_primary_term" : 3}},{"update": {"_index": "test","_type": "_doc","_id": "1","_version": 2,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"status": 200,"_seq_no" : 3,"_primary_term" : 4}}]
}

bulk请求的路径有三种和前面的mget的请求类似:

(1) /_bulk  (2)/{index}/_bulk(3)/{index}/{type}/_bulk

上面的三种格式,如果提供了index和type那么在数据体里面的action就可以不提供,同理提供了index但没有type,那么就需要在数据体里面自己添加type。

此外,还有几个参数可以用来控制一些操作:

(1)数据体里面可以使用_version字段

(2)数据体里面可以使用_routing字段

(3)可以设置wait_for_active_shards参数,数据拷贝到多个shard之后才进行bulk操作

(4)refresh控制多久间隔多搜索可见

最后重点介绍下update操作,update操作在前面的文章也介绍过,es里面提供了多种更新数据的方法如:

(1)doc
(2)upsert
(3)doc_as_upsert
(4)script
(5)params ,lang ,source

在bulk里面的使用update方法和java api里面类似,前面的文章也介绍过详细的使用,现在我们看下在bulk的使用方式:

POST _bulk
{ "update" : {"_id" : "1", "_type" : "_doc", "_index" : "index1", "retry_on_conflict" : 3} }
{ "doc" : {"field" : "value"} }
{ "update" : { "_id" : "0", "_type" : "_doc", "_index" : "index1", "retry_on_conflict" : 3} }
{ "script" : { "source": "ctx._source.counter += params.param1", "lang" : "painless", "params" : {"param1" : 1}}, "upsert" : {"counter" : 1}}
{ "update" : {"_id" : "2", "_type" : "_doc", "_index" : "index1", "retry_on_conflict" : 3} }
{ "doc" : {"field" : "value"}, "doc_as_upsert" : true }
{ "update" : {"_id" : "3", "_type" : "_doc", "_index" : "index1", "_source" : true} }
{ "doc" : {"field" : "value"} }
{ "update" : {"_id" : "4", "_type" : "_doc", "_index" : "index1"} }
{ "doc" : {"field" : "value"}, "_source": true}

其实就是非格式化的内容,放在一行然后提交就行了,不同之处在于前面的文章介绍的是单次请求,而使用bulk之后就可以一次请求批量发送多个操作了。

总结:

本篇文章介绍了在es里面bulk操作的用法,使用bulk操作我们可以批量的插入数据来提升写入性能,但针对不同的action的它的数据格式体是不一样的,这一点需要注意,同时在每行数据结束时必须加一个换行符,不然es是不能正确识别其格式的。

elasticsearch里面bulk的用法相关推荐

  1. Elasticsearch的bulk用法(python)

    这篇文章介绍Elasticsearch的bulk在Python中的用法,bulk API可以在单个请求中一次执行多个操作(index,udpate,create,delete),使用这种方式可以极大的 ...

  2. python elasticsearch bulk_关于ElasticSearch Bulk的用法

    Background 刚接触ElasticSearch不久,公司让我帮忙去导一下数据,刚开始数量并不是很大,我都是用Elasticsearch python的api接口,一条一条数据去往新的index ...

  3. bulk怎么使用oracle,oracle学习之bulk collect用法

    通过bulk collect减少loop处理的开销,使用Bulk Collect提高Oracle查询效率 Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使 ...

  4. ElasticSearch的基本原理与用法

    一.简介 ElasticSearch和Solr都是基于Lucene的搜索引擎,不过ElasticSearch天生支持分布式,而Solr是4.0版本后的SolrCloud才是分布式版本,Solr的分布式 ...

  5. 导入json数据到Elasticsearch(bulk方法)

    一.前言 在前面几章,基本把本地的环境给配置好了,那么配置好了之后,要做的第一件事当然就是导入数据进去.我这边准备的是一份json数据,这里通过ES的bulk API给导入进去. 二.导入数据 1.批 ...

  6. elasticsearch安装与基础用法

    来自官网,版本为2.3 注意elasticsearch依赖jdk,2.3依赖jdk7 下载rpm包并安装 wget -c https://download.elastic.co/elasticsear ...

  7. python elasticsearch bulk_Elasticsearch —— bulk批量导入数据

    在使用Elasticsearch的时候,一定会遇到这种场景--希望批量的导入数据,而不是一条一条的手动导入.那么此时,就一定会需要bulk命令! 更多内容参考我整理的Elk教程 bulk批量导入 批量 ...

  8. bulk插入 es_elasticsearch的helpers.bulk和es_client.bulk的用法

    from elasticsearch import Elasticsearch import datetime es_client = Elasticsearch(["127.0.0.1:9 ...

  9. 【Elasticsearch】bulk的使用

    在之前测试中使用bulk批量添加数据的案例 打印$req 看文档 https://www.elastic.co/guide/en/elasticsearch/reference/current/doc ...

最新文章

  1. ECharts 交互组件概述
  2. 【电子书】C++编程开发30问
  3. Android实训日志:基于外部存储卡的音乐播放器V02
  4. 【CyberSecurityLearning 68】python 编写exp
  5. java gui中文变方块_我的世界Java版 20w48a 发布 添加滴石和尖滴石
  6. TestContainers和Spring Boot
  7. mysql新增范围之外数据_mysql第二天 数据的增删改查补充及外键
  8. 实例具体解释Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(二)...
  9. 转 8天入门wpf—— 第六天 细说控件
  10. c语言static int x,为什么要使用static_cast int (x)而不是(int)x?
  11. centos引导过程中的故障排除
  12. 计算机学生的高职英语课程,高职计算机英语课程教学方法探索
  13. 2022-2027年中国图书馆RFID行业市场深度分析及投资战略规划报告
  14. Spark Event Log (一)概述
  15. 联想一键恢复系统教程
  16. 9 个美观大气的后台管理系统(收藏备用)
  17. 《信用管理》--信用评分方法之Z评分模型、ZETA评分模型
  18. 基于快速GeoHash,如何实现海量商品与商圈的高效匹配?...
  19. 5G DTU 数据上传 无线通信
  20. 互联网快讯:粉笔科技创新推进OMO模式;猿辅导以科技助力教育提质增效;“莆田鞋”注册成功

热门文章

  1. oracle数据库更换字符集(AL32UTF8--> ZHS16GBK)
  2. 腾讯地图实现点击搜索地址功能
  3. P3906 Geodetic集合
  4. Rxjava2原理流程+操作符+线程切换 浅析~
  5. IP-guard助力防御incaseformat蠕虫病毒
  6. 好用的翻译软件-大家都在用的互译软件
  7. spyder crashed during last session
  8. 解析北斗+UWB室内外一体化融合定位技术
  9. Axure绘制登录功能
  10. 【Redis实现系列】集群MOVED错误与ASK错误