作为一个成熟的框架,Elasticsearch里面提供了丰富的操作数据的api,本篇我们就来学习一下在es中更新数据的几种方式。

(一)更新文档

(1)部分更新:

java api:

` HashMap data=new HashMap<>();

data.put("name","woshigcs");

data.put("age",25);

UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-21", "active", "18");

urb.setDoc(data);

urb.execute().actionGet();

System.out.println("update ok......");

注意部分更新功能,前提是索引和该条数据已经存在,否则会抛出对应的异常,只要任何一个不满足,都会更新失败。

curl:

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{

"doc" : {

"name" : "new_name"

}

}

(2)使用detect_noop

java api:

` HashMap data=new HashMap<>();

data.put("name","woshigcs");

data.put("age",25);

UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-21", "active", "18");

urb.setDoc(data);

urb.setDetectNoop(false);//默认是true

urb.execute().actionGet();

System.out.println("update ok......");

curl方式:

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{

"doc" : {

"name" : "new_name"

},

"detect_noop": false

}'

注意detect_noop的意思:

默认情况下detect_noop=true

默认情况下只有原来的source和新的source存在不同的字段情况下才会重建索引,如果一模一样是不会触发重建索引的,如果将detect_noop=false不管内容有没有变化都会重建索引,这一点可以通过version的值的变化来发现

更新的文档,必须提前存在,除非你用upset+script来更新,否则会报document

missing异常

(二)script + upset更新方式:

java api

` HashMap params=new HashMap<>();

HashMap data=new HashMap<>();

data.put("name","12345");

params.put("source",data);

StringBuffer sb_json = new StringBuffer("ctx._source=source");

Script script = new Script(sb_json.toString(), ScriptService.ScriptType.INLINE, "groovy", params);

UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-11", "active", "16");

urb.setScript(script);

urb.setUpsert(data);

urb.execute().actionGet();

System.out.println("更新完事。。。。。。 ");

curl

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{

"script" : {

"inline": "ctx._source.counter += count",

"params" : {

"count" : 4

}

},

"upsert" : {

"counter" : 1

}

}'

(三):scripted_upsert用法:

官网个的例子没有跑通,下面这个是按照stackoverflow上面的例子改写的,可以通过

在postman里面已经跑通:

首先是在post请求的url

java api:

` HashMap params=new HashMap<>();

HashMap data=new HashMap<>();

data.put("name","12345");

HashMap newdata=new HashMap<>();

newdata.put("name","789");

params.put("data",data);

params.put("newdata",newdata);

StringBuffer sb_json = new StringBuffer("if (ctx.op == \"create\") ctx._source=data; else ctx._source=newdata");

Script script = new Script(sb_json.toString(), ScriptService.ScriptType.INLINE, "groovy", params);

UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-11", "active", "16");

urb.setScript(script);

urb.setScriptedUpsert(true);

urb.setUpsert("{}");//必须有这个值,否则会报document missing exception

urb.execute().actionGet();

System.out.println("更新完事。。。。。。 ");

curl方式

http://192.168.201.5:9200/active2018-03-11/active/11/_update

然后是下面的body里面选择raw然类型是JSON(application/json):

{

"scripted_upsert":true,

"script" : {

"script":"if (ctx.op == \"create\") ctx._source=data; else ctx._source=newdata ",

"params" : {

"data":{

"ct":11,

"aid":"a22",

"tid":"t11"

},

"newdata":{

"ct":1000,

"aid":"a2qq2",

"tid":"qq"

}

}

},

"upsert" : {}

}

执行上面的脚本,首先会检查索引是否存在,如果不存在就会新建一个索引,然后会判断id等于11这条数据存在不存在,如果不存在就把data里面的数据作为第一次的插入数据,如果已经存在就会把原来的数据删除掉然后把newdata的数据插入进去,可以理解就是更新。这里需要注意,如果用的是动态mapping,需要注意数据的类型,动态mapping下两条数据里面的同一个字段可以拥有不同的类型,这样既灵活又带来了风险,所以对于严谨类型的数据推荐使用静态mapping,严格限定字段的类型。

(四)doc_as_upsert方式:

这个方式其实就是前面两个的简洁版,意思就是没有就插入有就覆盖,注意这是是覆盖并不是把原来的删除在插入,而且如果是动态mapping还可以改变字段的类型,但不建议这么用。

java api:

` HashMap data=new HashMap<>();

data.put("name","234");

data.put("age",123);

data.put("address","北京海淀区");

UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-11", "active", "16");

urb.setDoc(data);

urb.setDocAsUpsert(true);

urb.execute().actionGet();//

System.out.println("操作成功......");

curl方式:

http://192.168.201.5:9200/active2018-03-11/active/12/_update

{

"doc" : {

"name" : "6755",

"age":12,

"address":"北京朝阳"

},

"doc_as_upsert" : true

}

总结:

上面更新操作es几种方法,总体来说使用script更新的方式最强大,可以做一些复杂业务场景的操作,如数值的累增或者操作集合对象元素的追加或者删除,其他的几种方式适合简单的更新操作。

不管使用那种更新方式,我们都需要考虑并发问题,通过前面一系列的文章的介绍,我们知道es里面的更新,删除,都是伪操作,尤其是更新,在es内部的实际处理流程是:

(1)查询旧的document数据

(2)修改成最新的数据

(3)然后重建整条document

在这里的三个阶段,如果同时又另外一个进程也在修改该条数据,就会发生冲突,es里面是根据version字段来判断是否冲突的,在上面的步骤中的第一步查询旧的数据会得到version字段,在第三步时候写的时候会把这个version字段在传回,这个时候如果发现version不一致就会发生冲突然后抛出异常,所以大家在使用的时候可以优先通过设计避免多线程操作,如果实在没法避免则可以使用es里面的提供的version字段来通过乐观锁控制并发问题,如果操作是简单的累加或累减还可以用更简单的方法冲突重试来解决并发问题,一句话就是具体场景具体分析,关于es并发问题后面有空可以单独再整理一篇文章出来。

es重建字段类型_关于elasticsearch中更新数据的几种方式相关推荐

  1. 控制器中接收数据的四种方式

    控制器中接收数据的四种方式: (仅限于个别的方式(get/post)有效) 通过形参的方式接收表单提交的数据(可以接收post与get提交的数据): 注释: GetData自己定义的方法名里面存入形参 ...

  2. 在.NET Core 中收集数据的几种方式

    APM是一种应用性能监控工具,可以帮助理解系统行为, 用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题, 通过汇聚业务系统各处理环节的实时数据,分析业务系统各事务处理的交易路径和处理 ...

  3. junit 5测试异常处理_在JUnit中处理异常的3种方式。 选择哪一个?

    junit 5测试异常处理 在JUnit中,有3种流行的方式来处理测试代码中的异常: 试捕习语 使用JUnit规则 带注解 我们应该使用哪一个?何时使用? 试捕习语 这个习语是最受欢迎的习语之一,因为 ...

  4. 向数据库中插入数据的三种方式

    在数据库中,向数据库中插入数据,使用insert into关键字.在数据库中插入数据有三种方法. 1)插入单个字段的情况 insert into table_name(列名) values(值); 2 ...

  5. oracle从mysql抓数据_关于oracle数据库读取数据的三种方式

    打开oracle sqldeveloper,连接到HR模式下的数据库,在SQL工作表中,执行如下语句: CREATE TABLE WANG( Name  varchar2(6), ID     num ...

  6. sql中删除数据的几种方式

    1.delete语句 Delete删除表数据,保留表结构,且可以加where,删除一行或多行. delete from 表名 where codition 2 .truncate 只清除数据,保留表结 ...

  7. 使用KONGA配置Elasticsearch中的数据作为API接口

    前提条件: 首先要将Oracle的数据导入到Elasticsearch中.之前的步骤以及总结在下面的博客中:使用logstash将Oracle数据导入到Elasticsearch 一.在Elastic ...

  8. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片 ...

  9. html中获取modelandview中的json数据_从Bitmap中获取YUV数据的两种方式

    从Bitmap中我们能获取到的是RGB颜色分量,当需要获取YUV数据的时候,则需要先提取R,G,B分量的值,然后将RGB转化为YUV(根据具体的YUV的排列格式做相应的Y,U,V分量的排列) 所以这篇 ...

最新文章

  1. CentOS 6 安装极点五笔拼音输入法
  2. hdu1.2.7 Just A Triangle
  3. python文件操作:新建删除文件,获取拼接路径,罗列文件路径
  4. 【项目管理】认识项目相关方(干系人)管理
  5. ARP防治攻略————服务器防护
  6. vue图片image
  7. ×××技术详解(二)
  8. VS Code 实用快捷键
  9. 再见实体店!推荐一个Python神器,能在线帮助小姐姐试衣服!
  10. C# 标准ASCII 码表
  11. Excel计算个人所得税公式
  12. 手把手教你千万级唯一ID如何生成
  13. 【年月】-单词学习记录(模板)
  14. 艾欧尼亚服务器延迟正常吗,lol延迟和服务器位置有关系?为什么我的lol延迟这么高?...
  15. L1-078 吉老师的回归 (15 分) C语言
  16. 轻风送暖写诗意,梅雨传情送祝福
  17. iOS 基于PhotoKit 获取系统所有相册 以及所有照片 包括iCloud的处理 细节详解及实战代码
  18. Cisco RV340命令执行漏洞(CVE-2022-20707)及关联历史漏洞分析
  19. MongoDB未授权访问
  20. 汇编命令及OD常用命令及断点设置

热门文章

  1. heartbeat+drbd+mysql:实现最廉价的高可用组合
  2. 使用gPXE网络启动引导ISO和安装ESXi5
  3. 关于librtmp接收数据(接收网络电视的数据流)
  4. deepin-Code::Blocks安装与配置
  5. 树莓派安装screen保证SSH断开 任务不中断
  6. 任正非谈鸿蒙系统失误,谷歌也没想到会来的这么快,任正非谈鸿蒙:系统不难,生态快完善...
  7. Ubuntu 14.04安装JDK1.8.0_25与配置环境变量
  8. [转载]ASP.NET Core文件上传与下载(多种上传方式)
  9. 1.3. PostgreSQL 官方 YUM 源安装
  10. eclipse下安装PyDev不显示问题