更新操作,一般用这个的,应该不会很多吧!ES本身还是一个倾向于查询检索的框架,对于这种更新的操作,太过频繁总归是不好的。
不过阅读本篇后,你可以使用Script对所有的文档执行更新操作,也可以使用doc对部分文档执行更新,也可以使用upsert对不存在的文档执行添加操作。
更新
Update更新操作允许ES获得某个指定的文档,可以通过脚本等操作对该文档进行更新。可以把它看成是先删除再索引的原子操作,只是省略了返回的过程,这样即节省了来回传输的网络流量,也避免了中间时间造成的文档修改冲突。
下面就是更新的例子:
curl -XPUT localhost:9200/test/type1/1 -d '{
"counter" : 1,
"tags" : ["red"]
}'
脚本更新
Es支持通过脚本更改文档的信息:
curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
"script" : {
"inline": "ctx._source.counter += count",
"params" : {
"count" : 4
}
}
}'
上面就是通过参数来为每个counter加4.
也可以添加某个标记:
curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
"script" : {
"inline": "ctx._source.tags += tag",
"params" : {
"tag" : "blue"
}
}
}'
除了_source
字段,可以通过ctx
来获得_index
、_type
、_id
、_version
、_parent
、_timestamp
、_ttl
等字段信息。
也可以添加某个字段:
curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
"script" : "ctx._source.name_of_new_field = \"value_of_new_field\""
}'
移除字段:
curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
"script" : "ctx._source.remove(\"name_of_field\")"
}'
也支持稍微复杂点的逻辑,比如根据某个标记执行不同的操作。比如如果有blue这个标记,则删除该文档;否则什么也不做:
curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
"script" : {
"inline": "ctx._source.tags.contains(tag) ? ctx.op = \"delete\" : ctx.op = \"none\"",
"params" : {
"tag" : "blue"
}
}
}'
只更新部分文档
上面的脚本是对所有的文档都起作用,这里讲解下如何只对部分文档进行修改。使用doc可以实现简单的递归合并、内部合并、替换KV以及数组。
curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
"doc" : {
"name" : "new_name"
}
}'
如果同时使用了doc和script,那么doc的操作会自动忽略。因此最好是把特殊的操作也放在脚本中。
更新检测
如果使用doc,那么会自动合并到现有的文档中。如果doc中定义的部分与现在的文档相同,则默认不会执行任何动作。设置detect_noop=false
,就会无视是否修改,强制合并到现有的文档。
curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
"doc" : {
"name" : "new_name"
},
"detect_noop": false
}'
上面的例子中,如果name字段为new_name,无论当前的文档是否与doc中定义的相同,都会把doc合并到文档中。
upsert插入
这个参数主要用于当文档不存在时,ES的操作。
curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
"script" : {
"inline": "ctx._source.counter += count",
"params" : {
"count" : 4
}
},
"upsert" : {
"counter" : 1
}
}'
在上面的例子中,当文档存在时,执行脚本;当文档不存在时,upsert中的内容就会插入到对应的文档中。
如果你想无论文档是否存在都执行脚本操作,那么可以使用参数scripted_upsert为true。
curl -XPOST 'localhost:9200/sessions/session/dh3sgudg8gsrgl/_update' -d '{
"scripted_upsert":true,
"script" : {
"id": "my_web_session_summariser",
"params" : {
"pageViewEvent" : {
"url":"foo.com/bar",
"response":404,
"time":"2014-01-01 12:32"
}
}
},
"upsert" : {}
}'
相对于之前的使用Upsert中的内容添加到不存在的文档,使用doc_as_upsert
可以在文档不存在的时候,把doc中的内容插入到文档中。
curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
"doc" : {
"name" : "new_name"
},
"doc_as_upsert" : true
}'
参数
retry_on_conflict
当执行索引和更新的时候,有可能另一个进程正在执行更新。这个时候就会造成冲突,这个参数就是用于定义当遇到冲突时,再过多长时间执行操作。
routing
Routing is used to route the update request to the right shard and sets the routing for the upsert request if the document being updated doesn’t exist. Can’t be used to update the routing of an existing document.
parent
Parent is used to route the update request to the right shard and sets the parent for the upsert request if the document being updated doesn’t exist. Can’t be used to update the parent of an existing document.
timeout
当分片不可用的时候,等待多长时间
consistency
The write consistency of the index/delete operation.
索引/删除操作的写一致性!不知道怎么用
refresh
当执行操作的时候,会自动刷新索引。
fields
执行完更新后,返回的字段
version & version_type
更新操作会使用版本号来确定 拿到文档到执行更新期间,文档是否被修改过。也可以通过特定的版本号,更新文档。如果使用force作为版本号,那么更新操作将不会再改变版本号。注意,这样就无法保证文档是否被修改了。
外部版本号
更新操作是不支持外部版本号的,因为本来外部版本号就脱离系统的版本控制,如果再执行更新操作,那就彻底乱了。如果使用了外部版本号,可以使用Index代替更新操作,重新索引文档。
相关推荐
elasticsearch5.5.0 的增删改查java api操作 支持新建mapping 根据实体类的注解方式生成 支持ik分词 支持新建index 根据实体类注解 支持删除index 增删改查操作都很详细 网上的版本大多数都是2.x的 最新的和旧的...
结合实际项目,使用ElasticSearch restful接口实现对ES的增删改查以及聚合查询
本人花了几天时间学习es技术,共享给大家,本工程源码,对es文档shierwin/_doc问题库表进行数据的增删改查操作,字段是qustion,anwser,id自动生成;环境es6.8.6,jkd1.8!es官网规定jdk必须1.8.211以上版本!
spring boot2 实现elasticsearch 增删改查实例。elasticsearch-rest-high-level-client, 启动类启动 启动成功后:http://localhost:8080/els/search?mess=78787
关于 java 操作 的elasticsearch 7.x 的增删改查,下载即用,封装好的连接,查询哦,具体使用查看test 包下的方法即可
JDK环境为1.8,JEST5.0以上,ES6.0以上 我搭建的非maven项目,亲测增删改查没问题。
Elasticsearch 基础语法 增删改查聚合 配置结构化数据 postman,下载后直接导入 postman 即可
Elasticsearch的JAVA操作工具类,包括增删改查的封装,Elasticsearch的JAVA操作工具类,包括增删改查的封装
elasticsearch 增删改查,简单实现基于Apache lucene构建的开源搜索引擎。(直接基于Luence开发很复杂) Java写的,提供Restful API。 屏蔽复杂性,使全文搜索更简单。 可轻松横向扩展,支持PB级结构化和非结构化...
实现增删改查,同步mysql数据库,设置mapping 使用有问题可以联系我. 如果不使用maven 可以找我要jar包,使用过程中发现问题请大家指教. 所有的连接连接方式,数据库的连接方式,索引名称和类型全部写在EsAll.class中 各...
本实例是一个基于bboss es spring boot starter的demo maven工程,可供spring boot项目集成bboss elasticsearch rest client参考 展示了通过spring boot管理单集群功能和管理多集群功能 单集群测试用例:...
原elasticsearch sql(不是官方收费版)只支持select查询查找,现已完善支持增删改查功能且支持mybatis集成
umi+react+antd 增删改查
Java做客户端对Elasticsearch服务的增删改查及批量修改操作,代码简洁易懂,思路清晰有注释.详情参考https://blog.csdn.net/linhaiyun_ytdx/article/category/7042758
elasticSearch的操作demo:里面只有java类,pom配置,application.xml配置自己找
关于elasticsearch5.3.0基础增删改查 开源共享 方便他人 赠人玫瑰 手有余香
java API 对Elasticsearch的增删改查的基本操作,上面只是几个demo,如果遇到问题请留言,或者发邮箱(yelinsheng1@163.com),我们一起讨论!与君共勉!
springboot 整合 elasticsearch demo(内含增删改查)以及基本es操作 效果图在这里 :https://blog.csdn.net/Japhet_jiu/article/details/105581997
springboot集合elasticsearch demo(内含增删改查)以及基本es操作
- ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工...