目前更新文档的方式主要有两种
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