功能介绍
删除除了之前讲的之外,还有可以根据条件来进行删除。_delete_by_query接口是对查询到的结果进行删除操作,如示例:
curl -XPOST "http://127.0.0.1:9200/test/_delete_by_query?pretty" -H "Content-Type: application/json" -d'
{
"query": {
"match": {
"user": "qqq"
}
}
}'
返回值为:
{
"took" : 15,
"timed_out" : false,
"total" : 1,
"deleted" : 1,
"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" : [ ]
}
_delete_by_query获取索引启动时的快照,并使用内部版本控制删除它发现的内容,如果在获取快照和删除文档的时候版本发生了改变,那么删除的时候会失败,只有文档的版本号匹配才能删除。注意因为版本号不支持0,所以如果删除的时候版本号传过来的是0,那么删除将失败。
在使用_delete_by_query接口的时候,会依次使用查询接口,来找到相匹配的数据进行删除,每次都会查询出一批数据,使用批量请求进行删除,如果查询或者批量删除被拒绝,_delete_by_query接口有一个默认的重试策略(最多重试10次),如果超过最大重试次数,那么_delete_by_query接口将失败,并会返回错误信息,之前执行的删除操作不会回滚,依然有效,所有的失败结果都会返回,所以会出现多个失败结果的数据。
如果出现版本号冲突时,你不希望中止,那么可以使用conflicts=proceed或者在请求体中设置"conflicts": "proceed"
curl -XPOST "http://127.0.0.1:9200/test/_delete_by_query?pretty&conflicts=proceed" -H "Content-Type: application/json" -d'
{
"query": {
"match": {
"user": "qqq"
}
}
}'
也可以删除多个索引,跟搜索多少索引是一样的。
curl -XPOST "http://127.0.0.1:9200/test,test01/_delete_by_query?pretty" -H "Content-Type: application/json" -d'
{
"query": {
"match": {
"user": "qqq"
}
}
}'
如果你使用了路由,那么删除的时候也需要设置路由
curl -XPOST "http://127.0.0.1:9200/test/_delete_by_query?pretty&routing=1" -H "Content-Type: application/json" -d'
{
"query": {
"match": {
"user": "qqq"
}
}
}'
默认情况下,_delete_by_query的滚动大小是1000,当然也可以手动设置该值,在地址后面加scroll_size属性。
curl -XPOST "http://127.0.0.1:9200/test/_delete_by_query?pretty&scroll_size=5000" -H "Content-Type: application/json" -d'
{
"query": {
"match": {
"user": "qqq"
}
}
}'
请求参数
删除接口除了支持pretty参数外,还支持以下参数:refresh
, wait_for_completion
, wait_for_active_shards
, timeout
, and scroll
。
refresh参数:处理完删除请求之后,如果设置了refresh参数,那么会刷新相关删除相关分片的数据。与delete API不同,delete API只刷新接收删除操作的分片,而且不支持wait_for。
如果请求中包含wait_for_completion=false,则Elasticsearch将在启动请求之前进行检查,然后返回一个任务,该任务可与Tasks api一起用于取消或获取任务状态,Elasticsearch还将在.tasks/task/${taskId}处创建此任务的记录,作为文档,可以随时对该任务进行处理,如果任务完成了,那么一定要把它删除,这样es才能回收空间。
wait_for_active_shards表示在执行请求的时候必须要有多少个活跃的分片。
timeout表示多少时间没有响应就认为请求已经失败。_delete_by_query使用滚动搜索,可以指定scroll参数来设置活跃的时间,默认是5分钟。
requests_per_second可以设置为任意正数,在每个删除操作中设置一个超时时间来控制速率,设置成-1表示禁用。批次大小为1000,requests_per_second为500,
target_time = 1000 / 500 per second = 2 seconds
wait_time = target_time - write_time = 2 seconds - 0.5 seconds = 1.5 seconds
响应体
{
"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
如果在查询delete执行期间执行的任何请求超时,则将此标志设置为true。
total
成功处理的文档数量。
deleted
成功删除的文档数量。
batches
滚动获取数据的数量。
version_conflicts
按查询删除所命中的版本冲突数。
noops
总是返回0,只是为了和查询update,查询delete和reindex返回相同的结构体。
retries
按查询删除所尝试的重试次数。bulk是重试的批量操作的数量,search是重试的搜索操作的数量。
throttled_millis
请求休眠以符合requests_per_second的毫秒数。
requests_per_second
在查询delete期间每秒有效执行的请求数。
throttled_until_millis
在_delete_by_query响应中,该字段应该始终等于零。它只有在使用task API时才有意义,在task API中,它指示下一次再次执行节流请求,以符合requests_per_second。
failures
错误返回结果。
使用task api
可以使用task api来做删除操作,如:
curl -XGET "http://127.0.0.1:9200/_tasks?detailed=true&actions=*/delete/byquery"
没有返回内容,但是使用以下请求,会返回task:
curl -XPOST "http://127.0.0.1:9200/test/_delete_by_query?pretty&wait_for_completion=false" -H "Content-Type: application/json" -d'
{
"query": {
"match": {
"user": "qqq"
}
}
}'
返回值
{
"task" : "8uQK-B00RiWq03awtJok1Q:4028"
}
可以直接根据task来查询
curl -XGET "http://127.0.0.1:9200/_tasks/8uQK-B00RiWq03awtJok1Q:4028?pretty"
返回值为:
{
"completed" : true,
"task" : {
"node" : "8uQK-B00RiWq03awtJok1Q",
"id" : 4028,
"type" : "transport",
"action" : "indices:data/write/delete/byquery",
"status" : {
"total" : 0,
"updated" : 0,
"created" : 0,
"deleted" : 0,
"batches" : 0,
"version_conflicts" : 0,
"noops" : 0,
"retries" : {
"bulk" : 0,
"search" : 0
},
"throttled_millis" : 0,
"requests_per_second" : -1.0,
"throttled_until_millis" : 0
},
"description" : "delete-by-query [test]",
"start_time_in_millis" : 1565187824000,
"running_time_in_nanos" : 7293485,
"cancellable" : true,
"headers" : { }
},
"response" : {
"took" : 3,
"timed_out" : false,
"total" : 0,
"updated" : 0,
"created" : 0,
"deleted" : 0,
"batches" : 0,
"version_conflicts" : 0,
"noops" : 0,
"retries" : {
"bulk" : 0,
"search" : 0
},
"throttled" : "0s",
"throttled_millis" : 0,
"requests_per_second" : -1.0,
"throttled_until" : "0s",
"throttled_until_millis" : 0,
"failures" : [ ]
}
}
也可以取消task
curl -XPOST "http://127.0.0.1:9200/_tasks/8uQK-B00RiWq03awtJok1Q:4028/_cancel?pretty"
切分
查询delete支持滚动切分,通过并行可以提升处理性能。
手动切分
curl -XPOST "http://127.0.0.1:9200/test/_delete_by_query?pretty" -H "Content-Type: application/json" -d'
{
"slice": {
"id": 0,
"max": 2
},
"query": {
"range": {
"likes": {
"lt": 10
}
}
}
}'
curl -XPOST "http://127.0.0.1:9200/test/_delete_by_query?pretty" -H "Content-Type: application/json" -d'
{
"slice": {
"id": 1,
"max": 2
},
"query": {
"range": {
"likes": {
"lt": 10
}
}
}
}'
自动切分
使用slices
参数来设置需要多少slices。
curl -XPOST "http://127.0.0.1:9200/test/_delete_by_query?refresh&slices=5&pretty" -H "Content-Type: application/json" -d'
{
"query": {
"range": {
"likes": {
"lt": 10
}
}
}
}'
部分返回值
注意:本文归作者所有,未经作者允许,不得转载