`
weitao1026
  • 浏览: 995286 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

elasticsearch【更新】操作

 
阅读更多

基于上一篇博文基础上,进行es的操作,document的新增比较简单,就不说了,这里主要说说更新操作。

 

更新操作,有两大类,一个是Replace,一个是Update,就是说一个是替换,一个是更新。 替换,就是全文档更换,而更新可以只针对文档的局部字段。

 

1. 这里先说简单的Replace的操作。

先创建一个document,索引名为gengxin,文档类型为replace。

复制代码
 1 [water@CloudGame ES]$ curl -XPUT 'localhost:9200/gengxin/replace/1?pretty' -d '
 2 { 
 3   "name": "shihuc",
 4   "job": "System Software Dev Manager",
 5   "date": "2016-10-19"
 6 }'
 7 {
 8   "_index" : "gengxin",
 9   "_type" : "replace",
10   "_id" : "1",
11   "_version" : 1,                   
12   "_shards" : {
13     "total" : 2,
14     "successful" : 1,
15     "failed" : 0
16   },
17   "created" : true                  #注意,这里的信息状态是true
18 }
复制代码

查询看看创建的结果:

复制代码
 1 [water@CloudGame ES]$ curl "localhost:9200/gengxin/replace/1?pretty"
 2 {
 3   "_index" : "gengxin",
 4   "_type" : "replace",
 5   "_id" : "1",
 6   "_version" : 1,
 7   "found" : true,
 8   "_source" : {
 9     "name" : "shihuc",
10     "job" : "System Software Dev Manager",
11     "date" : "2016-10-19"
12   }
13 }
复制代码

没有什么问题。 然后我们对这个id为1的document进行replace操作:

复制代码
 1 [water@CloudGame ES]$ curl -XPUT 'localhost:9200/gengxin/replace/1?pretty' -d '
 2 { 
 3   "name": "wdn",
 4   "job": "TK CEO"
 5 }'
 6 {
 7   "_index" : "gengxin",
 8   "_type" : "replace",
 9   "_id" : "1",
10   "_version" : 2,
11   "_shards" : {
12     "total" : 2,
13     "successful" : 1,
14     "failed" : 0
15   },
16   "created" : false           #注意,这里的状态是false哟,表示没有新建一个
17 }
复制代码

再查看一下,这个被replace了的document内容:

复制代码
 1 [water@CloudGame ES]$ curl "localhost:9200/gengxin/replace/1?pretty"
 2 {
 3   "_index" : "gengxin",
 4   "_type" : "replace",
 5   "_id" : "1",
 6   "_version" : 2,
 7   "found" : true,
 8   "_source" : {
 9     "name" : "wdn",
10     "job" : "TK CEO"
11   }
12 }
复制代码

发现没有,这个被Replace后的数据,与新建的时候字段数量都不一样了,就和一个新建很类似。内容完全被替换了。

 

2. 下面看看Update更新操作,其实,这个操作是针对已经建立的document修改field的内容,字段field的名字和数量是不能被修改的,是不是差别出来了???对的,就是这个差别。

复制代码
 1 [water@CloudGame ES]$ curl -XPUT 'localhost:9200/gengxin/update/1?pretty' -d '
 2 { 
 3   "name": "water",
 4   "job": "跑龙套的宝宝",
 5   "date": "2016-10-19"
 6 }'
 7 {
 8   "_index" : "gengxin",
 9   "_type" : "update",
10   "_id" : "1",
11   "_version" : 1,
12   "_shards" : {
13     "total" : 2,
14     "successful" : 1,
15     "failed" : 0
16   },
17   "created" : true
18 }
复制代码

查看返回值:

复制代码
 1 [water@CloudGame ES]$ curl "localhost:9200/gengxin/update/1?pretty"
 2 {
 3   "_index" : "gengxin",
 4   "_type" : "update",
 5   "_id" : "1",
 6   "_version" : 1,
 7   "found" : true,
 8   "_source" : {
 9     "name" : "water",
10     "job" : "跑龙套的宝宝",
11     "date" : "2016-10-19"
12   }
13 }
复制代码

再来看看Update的操作:

复制代码
 1 [water@CloudGame ES]$ curl -XPOST "localhost:9200/gengxin/update/1/_update?pretty" -d '
 2 {
 3   "doc": {"job": "奋斗者"}
 4 }'
 5 {
 6   "_index" : "gengxin",
 7   "_type" : "update",
 8   "_id" : "1",
 9   "_version" : 5,
10   "_shards" : {
11     "total" : 2,
12     "successful" : 1,
13     "failed" : 0
14   }
15 }
复制代码

查看Update的结果:

复制代码
 1 [water@CloudGame ES]$ curl "localhost:9200/gengxin/update/1?pretty"
 2 {
 3   "_index" : "gengxin",
 4   "_type" : "update",
 5   "_id" : "1",
 6   "_version" : 5,
 7   "found" : true,
 8   "_source" : {
 9     "name" : "water",
10     "job" : "奋斗者",
11     "date" : "2016-10-19"
12   }
13 }
复制代码

到此,是不是发现Replace操作和Update操作的不同了?

1. 指令不同,replace前后都是PUT指令,其实,用POST也可以实现replace,比如上面的replace操作的时候,将PUT换成POST也可以的。但是最好还是用PUT, http指令中POST是用来更新数据的,PUT是用来新增数据用的,虽然两个没有严格的限制。还有,在做Update操作时,指令中含有关键字_update.

2. replace操作时,指令的-d的内容就是最后的数据的内容,也就是查询结果中_source中的内容,但是Update的操作,修改的只是_source中的某些字段的内容

 

另外,补充一下Update的操作,其实除了通过doc来修改指定的字段内容,还可以通过script来实现字段内容的修改。script的东西就比较多了,这里简单的演示一个inline的脚本处理,作为引子简单介绍下!

A. 创建一个文档,并查看结果, 文档的内容是说wangbaoqiang有几顶绿帽子,开始创建的时候写的是2个,后来发现其实只有马rong个jian人一个,于是乎要修改。。。

复制代码
 1 [water@CloudGame ES]$ curl -XPUT "localhost:9200/gengxin/update/2?pretty" -d '{
 2 > "name": "wangbaoqiang",
 3 > "green_hat": "2"
 4 > }'
 5 {
 6   "_index" : "gengxin",
 7   "_type" : "update",
 8   "_id" : "2",
 9   "_version" : 1,
10   "_shards" : {
11     "total" : 2,
12     "successful" : 1,
13     "failed" : 0
14   },
15   "created" : true
16 }
17 [water@CloudGame ES]$ 
18 [water@CloudGame ES]$ curl "localhost:9200/gengxin/update/2?pretty"
19 {
20   "_index" : "gengxin",
21   "_type" : "update",
22   "_id" : "2",
23   "_version" : 1,
24   "found" : true,
25   "_source" : {
26     "name" : "wangbaoqiang",
27     "green_hat" : "2"
28   }
29 }
复制代码

好吧,进行修改吧(行内脚本的方式实现):

复制代码
 1 [water@CloudGame ES]$ curl -XPOST "localhost:9200/gengxin/update/2/_update?pretty" -d '{
 2 > "script": "ctx._source.green_hat = count",
 3 > "inline": {
 4 >    "params" : {
 5 >      "count" : 1
 6 >    }
 7 >  }
 8 > }'
 9 {
10   "error" : {
11     "root_cause" : [ {
12       "type" : "remote_transport_exception",
13       "reason" : "[node-1][10.90.6.172:9300][indices:data/write/update[s]]"
14     } ],
15     "type" : "illegal_argument_exception",
16     "reason" : "failed to execute script",
17     "caused_by" : {
18       "type" : "script_exception",
19       "reason" : "scripts of type [inline], operation [update] and lang [groovy] are disabled"
20     }
21   },
22   "status" : 400
23 }
复制代码

报错了,意思是说行内脚本通过groovy语言执行update操作是被禁用了的。 查看帮助文档吧,发现script章节有介绍,需要修改elasticsearch.yml配置文件,再其最后,加入下面的内容,重新启动es:

1  script.inline: true
2  script.indexed: true
3  script.engine.groovy.inline.aggs: true

 

重启ES后,再次操作上述script方式的update指令:

复制代码
 1 [water@CloudGame ES]$ curl -XPOST "localhost:9200/gengxin/update/2/_update?pretty" -d '{
 2 "script": "ctx._source.green_hat = count",
 3 "inline": {
 4    "params" : {
 5      "count" : 1
 6    }
 7  }
 8 }'
 9 {
10   "_index" : "gengxin",
11   "_type" : "update",
12   "_id" : "2",
13   "_version" : 4,
14   "_shards" : {
15     "total" : 2,
16     "successful" : 1,
17     "failed" : 0
18   }
19 }
20 [water@CloudGame ES]$ 
21 [water@CloudGame ES]$ curl "localhost:9200/gengxin/update/2?pretty"
22 {
23   "_index" : "gengxin",
24   "_type" : "update",
25   "_id" : "2",
26   "_version" : 4,
27   "found" : true,
28   "_source" : {
29     "name" : "wangbaoqiang",
30     "green_hat" : 1
31   }
32 }
复制代码

是不是也还不错,比较容易实现。

补充一点tip,若update操作中doc和script关键字都出现了,那么doc将被忽略!

 

 

elasticsearch中给类型增加新字段                         

 

For instance, let’s add a new field to my_index:

PUT /my_index/_mapping/my_type
{
    "my_type": {
        "properties": {
            "english_title": {
                "type":     "string",
                "analyzer": "english"
            }
        }
    }
}

 

 

分享到:
评论

相关推荐

    Python中elasticsearch插入和更新数据的实现方法

    首先,我的索引结构是酱紫的。   ...以上所述是小编给大家介绍的Python中elasticsearch插入和更新数据的实现方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

    Java做客户端对Elasticsearch服务的增删改查及批量修改操作

    Java做客户端对Elasticsearch服务的增删改查及批量修改操作,代码简洁易懂,思路清晰有注释.详情参考https://blog.csdn.net/linhaiyun_ytdx/article/category/7042758

    python处理elasticsearch实例

    执行操作:通过创建的Elasticsearch连接对象,可以执行各种操作,如索引文档、搜索文档、更新文档、删除文档等。 索引文档:使用连接对象的index()方法,传入索引名称、文档类型和文档数据来将文档索引到Elastic...

    ElasticSearch5.2全网最全技术视频

    (2)包含市面上几乎没有的所有Elasticsearch高级知识点:包含地理位置搜索与聚合分析,term vector,suggester search,搜索模板定制,query执行剖析,数十种最全面的聚合分析,span query,shard分配定制,es插件...

    springboot-elasticsearch-master.rar

    springboot-elasticsearch API实现,使用spring-boot框架,实现ES查询,新增,删除及批量操作。更新pom及可启动使用,简单方便无烦恼

    python3实现elasticsearch批量更新数据

    废话不多说,直接上代码! updateBody = { query:{ range:{ write_date: { gte: 2019-01-15 12:30:17, lte: now } } }, script: { inline: ctx._source.index = params.index, params: { ...}

    基于ElasticSearch+RestHighLevelClient+SpringBoot搭建的通用搜索系统

    基于ElasticSearch7.3.2、RestHighLevelClient、SpringBoot搭建的通用搜索系统脚手架,帮助开发者快速搭建搜索系统 简介 基于ElasticSearch7.3.2版本的通用搜索系统 使用rest-high-level-client操作ES 封装常用api...

    elasticsearch-monitoring:使用Grafana仪表板监控Elasticsearch集群(通过Elasticsearch)

    基于在全球范围内调试和稳定许多Elasticsearch集群的经验,Elasticsearch Monitoring的制定和不断更新和改进。收集指标使用X-Pack监控Elastic的X-Pack Monitoring随代理一起提供,该代理将度量标准传送到用于监视的...

    Elasticsearch 技术解析与实战.zip

    前言 第1章 Elasticsearch入门 1 1.1 Elasticsearch是什么 1 1.1.1 Elasticsearch的历史 2 1.1.2 相关产品 3 1.2 全文搜索 3 1.2.1 Lucene介绍 4 1.2.2 Lucene倒排索引 4 1.3 基础知识 6 1.3.1 Elasticsearch术语及...

    Elastic7.x语法版本操作手册

    Elasticsearch 基础操作 2.1.1HTTP 操作 1)创建索引 2)查看所有索引 3)查看单个索引 4)删除索引 4)删除索引 2.1.1.2文档操作 1)创建文档 2)查看文档 3)修改文档 4)修改字段 5)删除文档 6)条件删除文档 ...

    es-crud:使用Java API的ElasticSearch CRUD操作

    ElasticSearch CRUD 在这个项目中,我已经使用Java API完成了ElasticSearch CRUD(创建读取更新和删除)操作。 这个项目对初学者学习非常有帮助。先决条件安装 ,然后启动elasticSearch。跑步将该项目作为Maven导入...

    wuzhc#zcnote#elasticsearch批量操作1

    批量局部更新doc是关键,表示不会全量替换,只是局部更新{"doc":{"content":"es是分布式的,可能有数百个节点,你不能每次都一个一个节点上面去修

    ElasticSearch自动部署工具Raigad.zip

    Raigad 是一个进程/工具,和 Elasticsearch 一起运行,可以自动操作:快照备份和恢复master-data-search 专用的可配置部署Tribe 节点部署发布 Elasticsearch 检测指标支持 AWS 环境Raigad 这个名字来自于印度的马哈...

    Elasticsearch数据库的连接客户端

    图形化界面连接Elasticsearch,方便开发人员操作,elasticsearch的客户端比较出名的就是elasticsearch head 和Kibana了, 但是elasticsearch head已经停止更新,且样式老旧,功能不全; 而Kibana虽功能全面,但是启动...

    Go-vulcanizer一个用于与Elasticsearch集群交互的golang库

    它的目标是提供高级API,以帮助处理与操作Elasticsearch集群相关的常见任务,例如查询集群的运行状况,从节点迁移数据,更新集群设置等。

    es-dedupe:用于从Elasticsearch删除重复文档的工具

    每次DELETE操作之后,我们都等待索引更新。 处理过的文档将登录到/tmp/es_dedupe.log 。 不幸的是,聚合查询不一定是精确的。 基于/tmp/es_dedupe.log日志文件,我们查询每个field值,并在其他分片上删除文档副本。...

    MySQL 与 Elasticsearch 数据不对称问题解决办法

    主要介绍了MySQL 与 Elasticsearch 数据不对称问题解决办法的相关资料,对于 elasticsearch 增量写入,但经常jdbc源一端的数据库可能会做数据库删除或者更新操作,这里提供解决办法,需要的朋友可以参考下

    mssql_elasticsearch_river

    这是一个POC,用于使用服务代理和外部C#应用程序从MSSQL实时更新Elasticsearch索引。 (显然)它还没有准备好投入生产,但是对如何为实时索引提供可伸缩的解决方案提供了一个很好的主意。 这个怎么运作 用户编辑表...

    台达可编程控制器(PLC)DVP32ES2-C安装说明.pdf

    台达可编程控制器(PLC)DVP32ES2-C安装说明pdf,台达可编程控制器(PLC)DVP32ES2-C安装说明:此主机提供32 点数输入/输出(16 点数字量输入、16 点数字量输出及内建CANopen 网络),含主机最大输入/输出扩展最多可...

Global site tag (gtag.js) - Google Analytics