关于elaticsearch中更新数据的几种方式

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

(一)普通更新

(1)修改某个字段

java api:

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

curl:

(2)使用detect_noop

java api:

curl方式:

注意detect_noop的意思:

默认情况下detect_noop=true

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

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

(二)script + upset更新方式:

java api

curl

(三):scripted_upsert用法:

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

在postman里面已经跑通:

首先是在post请求的url

java api:

curl方式

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

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

(四)doc_as_upsert方式:

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

java api:

curl方式:

总结:

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

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

(1)查询旧的document数据

(2)修改成最新的数据

(3)然后重建整条document

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

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2018-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏静下来

ECSHOP整合百度ueditor编辑器方法 支持远程图片本地化

image.png ECSHOP商城自带的编辑器实在是不能忍,太难用了。 就换成了百度的ueditor编辑器,本来最近修改了几个商城的,索性自己也记录一次吧。 ...

3456
来自专栏从零开始学自动化测试

Selenium2+python自动化27-查看selenium API

前言 前面都是点点滴滴的介绍selenium的一些api使用方法,那么selenium的api到底有多少呢?本篇就叫大家如何去查看selenium ap...

3419
来自专栏空帆船w

如何快速上传开源项目至 Jcenter

前几天上传了个项目至 Jcenter,看了网上很多教程,基本都是以 gradle-bintray-plugin 这个插件做上传,教程看着都好费劲,对于新手来说真...

1392
来自专栏北京马哥教育

开源跳板机Jumpserver v2.0.0 Beta版发布

demo页面: http://demo.jumpserver.org admin admin 一. 更新Log – 登录脚本 – 1.1 使用paramiko...

2185
来自专栏IT 指南者专栏

Maven 项目管理工具基础入门系列(二)

? 一、前言 Maven 项目管理工具基础系列(一) 这篇文章中,我们已经初步了解了 Maven,也知道了使用 Maven 作为项目管理工具的好处,特别是已经...

3649
来自专栏桥路_大数据

CentOS7服务器NodeJS安装

4238
来自专栏喵了个咪的博客空间

Otter-入门篇3(Node搭建)

Otter-入门篇3(Node搭建) ? 前言 哈咯大家好呀!今天是对otter准备的最后一个流程,配置好node,并且吧manager,zookeeper和n...

42113
来自专栏小尘哥的专栏

闹心的Broken pipe

4833
来自专栏云计算教程系列

如何在Ubuntu 16.04上安装Node.js

Node.js是一个用于通用编程的JavaScript平台,允许用户快速构建网络应用程序。通过在前端和后端利用JavaScript,开发可以更加一致并在同一系统...

5416
来自专栏xingoo, 一个梦想做发明家的程序员

【java开发系列】—— JDK安装

前言   作为一个java开发者,安装JDK是不可避免的,但是配置路径却总是记不住,百度也有很多参考例子。这里仅仅当做以后参考的笔记记录。   说到JD...

19510

扫码关注云+社区