一、引言
之前介绍的文档删除与更新(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" : [ ]
}