【ElasticSearch】更新文档的两种方式
目前更新文档的方式主要有两种
1.update api
2._update_by_query api
这里主要针对这两种做总结和说明
update api
这个例子演示了如何去更新我们先前的文档(ID 为 1),通过修改 name 字段的值为 “Jane Doe” :
curl -XPOST 'localhost:9200/customer/external/1/_update?pretty&pretty' -d' { "doc": { "name": "Jane Doe" } }'
对应的Kibana DSL
POST customer/external/1/_update { "doc": { "name":"Jane Doe" } }
这个例子演示了如何去更新我们先前的文档(ID 为 1),通过修改 name 字段的值为 “Jane Doe”,并且同时添加 age 字段 :
curl -XPOST 'localhost:9200/customer/external/1/_update?pretty&pretty' -d' { "doc": { "name": "Jane Doe", "age": 20 } }'
对应的Kibana DSL
POST index_account_sub_trans_detail_latest/account_sub_trans_detail/14/_update { "doc": { "accSubId":888888, "age": 20 } }
更新也是通过使用简单的简本来执行。这个例子演示了使用简本来将 age 加 5 :
curl -XPOST 'localhost:9200/customer/external/1/_update?pretty&pretty' -d' { "script" : "ctx._source.age += 5" }'
对应的Kibana DSL
POST index_account_sub_trans_detail_latest/account_sub_trans_detail/14/_update { "script": "ctx._source.age+=5" }
在上面的例子中,ctx._source 代表当前将被更新的源文档。
请注意,在编写该文档时,在同一时间中更新只能够被执行一个文档上。在将来,Elasticsearch 也许会提供给定一个查询条件(像 SQL UPDATE-WHERE 语句)来更新多个文档的功能。
_update_by_query
_update_by_query 最简单的用法只是基于索引来执行每个文档的更新,而不更改源(意思就是,简单的用法下,只会更新文档的版本号,而不修改源数据)。这是非常有用快捷的,在完成一些 map 的变化也得以表现。
这里是 API:
POST twitter/_update_by_query?conflicts=proceed
返回值类似于这样:
{ "took" : 147, "timed_out": false, "updated": 120, "deleted": 0, "batches": 1, "version_conflicts": 0, "noops": 0, "retries": { "bulk": 0, "search": 0 }, "throttled_millis": 0, "requests_per_second": -1.0, "throttled_until_millis": 0, "total": 120, "failures" : [ ] }
_update_by_query
获取索引的快照,当它开始和进行索引时发现使用的是 internal
的版本。这意味着如果在获取快照时或者进行索引请求时文档发生改变,那么将会发生版本冲突。当索引请求被处理的时间之间变化。当版本匹配文档被更新时候,版本号递增。
注意:
因为 internal
版本不支持的值 0 作为一个有效的版本号,与版本等于 0 时候,文档无法使用 _update_by_query 更新,请求将会失败。所有的更新和查询失败导致 _update_by_query
中止,并在返回错误的响应。正在执行的更新将会继续下去。换句话说,该方法不支持回滚,仅中止。虽然第一次失败将导致中止,由失败的请求返回所有故障将在 failures
元素体现。因此,有可能存在一些失败的实体。如果你想简单地统计版本冲突不会导致 _update_by_query
中止你可以在 URL 中设置 conflicts=proceed
或在请求中设置 "conflicts": "proceed"
。第一个例子做到这一点因为它只是试图获取一个当前的 mapping 变化,这里发生的版本冲突仅仅意味着冲突的文档在 _update_by_query
开始的时间和文件尝试更新时间之间被更新了。这样做具有一定的优点,因为更新将获取当前 mapping 更新。回到API格式,您可以限制 _update_by_query
到一个单一类型。这将只从 twitter
索引中更新 tweet 文件
:
限制 _update_by_query
到一个单一类型,这将只从 twitter
索引中更新 tweet 文件
POST twitter/tweet/_update_by_query?conflicts=proceed
限制 _update_by_query
使用 。这将更新从 twitter 索引中更新所有的文档
POST twitter/_update_by_query?conflicts=proceed { "query": { (1) "term": { "user": "kimchy" } } }
(1)查询必须作为一个值传递 query
键,就像在 Search API 中同样的方式。还可以使用的 q
参数。到目前为止,我们只是一直在更新文档,而无需更改其来源。
支持脚本对象更新文档。这将在所有 kimchy tweet 中增加
_update_by_querylikes
:
POST twitter/_update_by_query { "script": { "inline": "ctx._source.likes++", "lang": "painless" }, "query": { "term": { "user": "kimchy" } } }
参考文档:
https://www.kancloud.cn/apachecn/elasticsearch-doc-zh/1944946
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端