ElasticSearch 6.3版本 Document APIs之Update By Query API

本文介绍Elasticsearch中UpdateByQuery API的基本用法及注意事项,包括如何通过脚本更新文档、解决版本冲突等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Update By Query API

最简单的用法是_update_by_query在不更改源的情况下对索引中的每个文档执行更新。这对于获取新属性或其他一些在线映射更改很有用 。这是API:

POST twitter/_update_by_query?conflicts=proceed

_update_by_query在索引启动时获取索引的快照,并使用internal版本控制索引它。这意味着如果文档在拍摄快照的时间和处理索引请求之间发生更改,则会出现版本冲突。当版本匹配时,文档会更新,版本号会递增。

注:由于internal版本控制不支持将值0作为有效版本号,因此无法使用版本等于零的文档进行更新, _update_by_query并且将使请求失败。


所有更新和查询失败都会导致_update_by_query中止并failures在响应中返回。已执行的更新仍然存在。换句话说,该过程不会回滚,只会中止。当第一个失败导致中止时,失败的批量请求返回的所有失败都将在failures元素中返回; 因此,可能存在相当多的失败实体。

如果您只想计算版本冲突,不要导致_update_by_query 中止,您可以conflicts=proceed在URL或"conflicts": "proceed" 请求正文中设置。

_update_by_query 支持脚本来更新文档。

就像在Update API中一样,您可以设置ctx.op更改执行的操作:

  • noop
设置ctx.op = "noop"脚本是否确定不需要进行任何更改。这将导致_update_by_query从其更新中省略该文档。这种无操作将noop在响应机构的计数器中 报告。

  • delete
设置ctx.op = "delete"如果你的脚本决定,该文件必须被删除。删除将deleted在响应正文中的计数器中 报告。

设置ctx.op为其他任何内容都是错误的。设置任何其他字段ctx是错误的。


PUT gaoyh
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
}
}
GET gaoyh/test/_search
PUT gaoyh/test/3
{
"counter":1,
"tags":["red"]
}

按照tags标签进行查找,就算只查找,没有进行脚本操作,version一样会增加,result:updated;
根据查找条件,进行脚本操作,则所有匹配到的文档全部更新,批量更新,result:updated

POST gaoyh/_update_by_query
{
"query":{
"match":{
"tags":"red"
}
},
"script":{
"source":"ctx._source.tags.add(params.tag)",
"lang":"painless",
"params":{
"tag":"white"
}
}
}


PUT gaoyh
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"test":{
"dynamic":false,
"properties": {
"content":{
"type": "text"
}
}
}
}
}
禁止mapping动态映射


POST gaoyh/test?refresh
{
"content":"text",
"flag":"bar"
}
意味着新字段不会编入索引,只存储在_source中


PUT gaoyh/_mapping/test
{
"properties": {
"flag":{
"type":"text",
"analyzer": "keyword"
}
}
}
更新映射,添加新flag字段,但是要获取新字段必须使用它重新索引所有文档

未重新索引:
POST gaoyh/_search?filter_path=hits.total
{
"query": {
"match": {
"flag": "bar"
}
}
}
响应结果:
{
"hits" : {
"total" : 0
}
}

重新索引:
发出update_by_query请求获取新映射:
POST test/_update_by_query?refresh&conflicts=proceed
POST test/_search?filter_path=hits.total
{
"query": {
"match": {
"flag": "bar"
}
}
}
响应结果:
{
"hits" : {
"total" : 1
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值