Delete/Update by query

一、引言

之前介绍的文档删除与更新(ES的更新是重建->删除->重新索引)只能通过_id,但这不符合我们的使用场景,我们更希望能够像数据库那样通过条件进行删除/更新。
通过Delete/Update by query这两个API可以做到这点,对指定查询匹配的文档进行删除/更新。
之前在 2.X版本里 这个功能被去掉了 因为官方认为会引发一些错误 如需使用 需要自己安装插件。那么在5.x版本中 这个api又被官方重新加回自带功能。

二、通过查询删除文档

请求

您可以使用与Search API相同的语法在请求URI或请求正文中指定查询条件:

POST /twitter/_delete_by_query
{
  "query": {
    "match": {
      "message": "some message"
    }
  }
}

当您提交按查询删除请求时,Elasticsearch在开始处理请求时会获取索引的快照,并使用内部版本控制删除匹配的文档。
如果在获取快照和处理删除操作之间更改了文档,则将导致版本冲突,并且删除操作将失败。

Note:
版本等于0的文档无法使用查询删除功能删除,因为内部版本控制不支持0作为有效版本号。

在处理按查询删除的请求时,Elasticsearch会顺序执行多个搜索请求以找到所有要删除的匹配文档。 对每批匹配的文档执行批量删除请求。 如果搜索或批量请求被拒绝,则该请求最多重试10次,并以指数方式退回。 如果达到最大重试限制,则处理暂停,并且所有失败的请求都将返回到响应中。 成功完成的所有删除请求仍会保留,不会回滚。

响应

响应如下:

{
  "took" : 147,
  "timed_out": false,
  "total": 119,
  "deleted": 119,
  "batches": 1,
  "version_conflicts": 0,
  "noops": 0,
  "retries": {
    "bulk": 0,
    "search": 0
  },
  "throttled_millis": 0,
  "requests_per_second": -1.0,
  "throttled_until_millis": 0,
  "failures" : [ ]
}
  • took
    从整个操作开始到结束的毫秒数。
  • timed_out
    如果在通过查询执行删除期间执行的任何请求已超时,则将该标志设置为true。
  • total
    成功处理的文档数。
  • deleted
    成功删除的文档数。
  • batches
    通过按查询删除的滚动响应数。
  • version_conflicts
    通过查询删除导致的版本冲突数量。
  • noops
    对于通过查询删除,此字段始终等于零。它仅存在,以便按查询删除,按查询更新和重新索引API会返回具有相同结构的响应。
  • retries
    通过查询删除尝试的重试次数。 bulk是重试的批量操作数,search是重试的搜索操作数。
  • throttled_millis
    请求经过睡眠以符合request_per_second的毫秒数。
  • requests_per_second
    在通过查询删除期间有效执行的每秒请求数。
  • throttled_until_millis
    在_delete_by_query响应中,该字段应始终等于零。它仅在使用Task API时才有意义,它表示下一次(自时期以来的毫秒数),为了符合requests_per_second,将再次执行受限制的请求。
  • failures
    如果在此过程中存在任何不可恢复的错误,则为一系列失败。如果这是非空的,则请求由于这些失败而中止。按查询删除是使用批处理实现的,任何失败都会导致整个过程中止,但是当前批处理中的所有失败都会收集到阵列中。您可以使用冲突选项来防止重新索引在版本冲突时中止。

例子

Delete all tweets from the twitter index:

#conflicts=proceed版本冲突则继续,abort or proceed,默认是proceed
POST twitter/_delete_by_query?conflicts=proceed
{
  "query": {
    "match_all": {}
  }
}

Delete documents from multiple indices:

POST /twitter,blog/_delete_by_query
{
  "query": {
    "match_all": {}
  }
}

更多Delete by query API 的参数以及相关使用示例参见:Delete by query API

三、通过查询更新文档

POST my-index2/_update_by_query
{
   "query" : {
      "match": {
        "age": 31
      }
   },
  "script" : "ctx._source.age+=1"
}

注意:
不支持doc的方式更新,用script脚本更新;

{
  "took" : 12,
  "timed_out" : false,
  "total" : 1,
  "updated" : 1,
  "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,
  "failures" : [ ]
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值