elasticsearch【更新】操作
基于上一篇博文基础上,进行es的操作,document的新增比较简单,就不说了,这里主要说说更新操作。
更新操作,有两大类,一个是Replace,一个是Update,就是说一个是替换,一个是更新。 替换,就是全文档更换,而更新可以只针对文档的局部字段。
1. 这里先说简单的Replace的操作。
先创建一个document,索引名为gengxin,文档类型为replace。
[water@CloudGame ES]$ curl -XPUT 'localhost:9200/gengxin/replace/1?pretty' -d '
{
"name": "shihuc",
"job": "System Software Dev Manager",
"date": "2016-10-19"
}'
{
"_index" : "gengxin",
"_type" : "replace",
"_id" : "",
"_version" : ,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"created" : true #注意,这里的信息状态是true
}
查询看看创建的结果:
[water@CloudGame ES]$ curl "localhost:9200/gengxin/replace/1?pretty"
{
"_index" : "gengxin",
"_type" : "replace",
"_id" : "",
"_version" : ,
"found" : true,
"_source" : {
"name" : "shihuc",
"job" : "System Software Dev Manager",
"date" : "2016-10-19"
}
}
没有什么问题。 然后我们对这个id为1的document进行replace操作:
[water@CloudGame ES]$ curl -XPUT 'localhost:9200/gengxin/replace/1?pretty' -d '
{
"name": "wdn",
"job": "TK CEO"
}'
{
"_index" : "gengxin",
"_type" : "replace",
"_id" : "",
"_version" : ,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"created" : false #注意,这里的状态是false哟,表示没有新建一个
}
再查看一下,这个被replace了的document内容:
[water@CloudGame ES]$ curl "localhost:9200/gengxin/replace/1?pretty"
{
"_index" : "gengxin",
"_type" : "replace",
"_id" : "",
"_version" : ,
"found" : true,
"_source" : {
"name" : "wdn",
"job" : "TK CEO"
}
}
发现没有,这个被Replace后的数据,与新建的时候字段数量都不一样了,就和一个新建很类似。内容完全被替换了。
2. 下面看看Update更新操作,其实,这个操作是针对已经建立的document修改field的内容,字段field的名字和数量是不能被修改的,是不是差别出来了???对的,就是这个差别。
[water@CloudGame ES]$ curl -XPUT 'localhost:9200/gengxin/update/1?pretty' -d '
{
"name": "water",
"job": "跑龙套的宝宝",
"date": "2016-10-19"
}'
{
"_index" : "gengxin",
"_type" : "update",
"_id" : "",
"_version" : ,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"created" : true
}
查看返回值:
[water@CloudGame ES]$ curl "localhost:9200/gengxin/update/1?pretty"
{
"_index" : "gengxin",
"_type" : "update",
"_id" : "",
"_version" : ,
"found" : true,
"_source" : {
"name" : "water",
"job" : "跑龙套的宝宝",
"date" : "2016-10-19"
}
}
再来看看Update的操作:
[water@CloudGame ES]$ curl -XPOST "localhost:9200/gengxin/update/1/_update?pretty" -d '
{
"doc": {"job": "奋斗者"}
}'
{
"_index" : "gengxin",
"_type" : "update",
"_id" : "",
"_version" : ,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
}
}
查看Update的结果:
[water@CloudGame ES]$ curl "localhost:9200/gengxin/update/1?pretty"
{
"_index" : "gengxin",
"_type" : "update",
"_id" : "",
"_version" : ,
"found" : true,
"_source" : {
"name" : "water",
"job" : "奋斗者",
"date" : "2016-10-19"
}
}
到此,是不是发现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人一个,于是乎要修改。。。
[water@CloudGame ES]$ curl -XPUT "localhost:9200/gengxin/update/2?pretty" -d '{
> "name": "wangbaoqiang",
> "green_hat": ""
> }'
{
"_index" : "gengxin",
"_type" : "update",
"_id" : "",
"_version" : ,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"created" : true
}
[water@CloudGame ES]$
[water@CloudGame ES]$ curl "localhost:9200/gengxin/update/2?pretty"
{
"_index" : "gengxin",
"_type" : "update",
"_id" : "",
"_version" : ,
"found" : true,
"_source" : {
"name" : "wangbaoqiang",
"green_hat" : ""
}
}
好吧,进行修改吧(行内脚本的方式实现):
[water@CloudGame ES]$ curl -XPOST "localhost:9200/gengxin/update/2/_update?pretty" -d '{
> "script": "ctx._source.green_hat = count",
> "inline": {
> "params" : {
> "count" :
> }
> }
> }'
{
"error" : {
"root_cause" : [ {
"type" : "remote_transport_exception",
"reason" : "[node-1][10.90.6.172:9300][indices:data/write/update[s]]"
} ],
"type" : "illegal_argument_exception",
"reason" : "failed to execute script",
"caused_by" : {
"type" : "script_exception",
"reason" : "scripts of type [inline], operation [update] and lang [groovy] are disabled"
}
},
"status" :
}
报错了,意思是说行内脚本通过groovy语言执行update操作是被禁用了的。 查看帮助文档吧,发现script章节有介绍,需要修改elasticsearch.yml配置文件,再其最后,加入下面的内容,重新启动es:
script.inline: true
script.indexed: true
script.engine.groovy.inline.aggs: true
重启ES后,再次操作上述script方式的update指令:
[water@CloudGame ES]$ curl -XPOST "localhost:9200/gengxin/update/2/_update?pretty" -d '{
"script": "ctx._source.green_hat = count",
"inline": {
"params" : {
"count" :
}
}
}'
{
"_index" : "gengxin",
"_type" : "update",
"_id" : "",
"_version" : ,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
}
}
[water@CloudGame ES]$
[water@CloudGame ES]$ curl "localhost:9200/gengxin/update/2?pretty"
{
"_index" : "gengxin",
"_type" : "update",
"_id" : "",
"_version" : ,
"found" : true,
"_source" : {
"name" : "wangbaoqiang",
"green_hat" :
}
}
是不是也还不错,比较容易实现。
补充一点tip,若update操作中doc和script关键字都出现了,那么doc将被忽略!
elasticsearch【更新】操作的更多相关文章
- elasticsearch更新操作问题
elasticsearch在更新的时候,是通过id进行管理的,我们在前台传入id操作,id如果与elasticsearch相同,则覆盖,否则新增一条记录.且elasticsearch中的插入一条记录和 ...
- ElasticSearch Index操作源码分析
ElasticSearch Index操作源码分析 本文记录ElasticSearch创建索引执行源码流程.从执行流程角度看一下创建索引会涉及到哪些服务(比如AllocationService.Mas ...
- es之对文档进行更新操作
5.7.1:更新整个文档 ES中并不存在所谓的更新操作,而是用新文档替换旧文档: 在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档并建立索引.旧版本文档不会立即消失 ,但 ...
- es 查询更新操作
# es 查询更新操作# _*_ coding: utf-8 _*_ import time import datetime import pymysql from elasticsearch imp ...
- 使用Spring Data ElasticSearch+Jsoup操作集群数据存储
使用Spring Data ElasticSearch+Jsoup操作集群数据存储 1.使用Jsoup爬取京东商城的商品数据 1)获取商品名称.价格以及商品地址,并封装为一个Product对象,代码截 ...
- MongoDB 文档的更新操作
在MongoDB中,更新单个doc的操作是原子性的.默认情况下,如果一个update操作更新多个doc,那么对每个doc的更新是原子性的,但是对整个update 操作而言,不是原子性的,可能存在前面的 ...
- 关于SubSonic3.0插件使用Json反序列化获得的实体进行更新操作时,只能执行添加而不能执行修改(编辑)操作的处理
由于目前开发的项目使用云计算技术,客户端只进行UI与相关事件的功能开发,而所有的计算与处理都放到了服务器端,客户端与数据库没有任何关联,所以服务器端与客户端使用我们自己开发的通讯加密方式进行,而具体的 ...
- java-int类型:int默认为0导致更新操作未赋值的情况下将值更新为0
日常开发中,做更新操作的时候的处理方法为:当这个字段有值则更新,没有值就不更新,在mybatis的xml中表现为: <!-- 修改记录,只修改只不为空的字段 --> <update ...
- 对oracle数据库进行增删改更新操作,executeUpdate()执行卡住了
原因是:oracle数据库更新数据后需要commit,不然会堵塞,就会卡住 那么每次调用executeUpdate()完后,数据库要自动commit才可以. 我的基类加了一下,注意红色字体部分代码: ...
- Java配置文件Properties的读取、写入与更新操作
/** * 实现对Java配置文件Properties的读取.写入与更新操作 */ package test; import java.io.BufferedInputStream; import j ...
随机推荐
- 【C++】rand()函数,时间种子
srand((unsigned)time(NULL)); //以时间为随机种子,写在循环前才有效(几个循环无所谓) ;i<=size;i++) { ;j<=size;j++) { ==ra ...
- 转-Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案
前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说 ...
- INTERSECT交集运算
INTERSECT交集是由既属于集合A,又属于集合B的所有元素组成的集合,如示意图1.
- 怎样将Sqlserver数据库转成mysql数据库
手上有一个网站之前是用asp.net做的,所使用的数据库是sqlserver,现在打算用PHP+MYSQL架构.因原来的站点有一定排名,直接改版的话,会导致产生很多错误页,网站排名和收录结果要恢复过来 ...
- echart------属性详细介绍
theme = { // 全图默认背景 // backgroundColor: 'rgba(0,0,0,0)', // 默认色板 color: ['#ff7f50','#87cefa','#da70d ...
- [NOI2007 Day1] 货币兑换 Cash
vijos P1508 / BZOJ 1492 膜拜了这么久的cdq分治,终于有机会亲自来写了.虽然这个思想很好理解,先做前一半,计算前一半对后一半的影响,再做后一半.但是由于我这个傻Ⅹ,以前既没有做 ...
- SQL升级脚本实现按版本差异化升级(优化)
1.增加了对SQL Server 2000的兼容: 2.支持对脚本目录的批量处理: 3.将脚本版本的判断放到具体的升级子脚本中去,让调度脚本更固化. -- 根据SQL的版本好确定启用xp_cmdshe ...
- EF 自定义校验设置和捕获异常
一.定义 public class MyItem: IValidatableObject { [Key] public long Id { get; set; } [Range(0, 100, Err ...
- springmvc学习第二天
一.pojo Spring mvc 会按请求参数名和pojo属性名进行自动匹配,自动为该对象填充属性值,并且支持级联属性 表单: <form action="springmvc/tes ...
- 解决Only a type can be imported. com.mysql.jdbc.Connection resolves to a package的报错问题
写jsp加载数据驱动以后老是提示Only a type can be imported. com.mysql.jdbc.Connection resolves to a package的错误,然而改成 ...