【Elasticsearch7.0】文档接口之查询delete接口

  |   0 评论   |   35 浏览

功能介绍

删除除了之前讲的之外,还有可以根据条件来进行删除。_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参数外,还支持以下参数:refreshwait_for_completionwait_for_active_shardstimeout, 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
      }
    }
  }
}'

部分返回值
image.png

也可以关注我的公众号:程序之声
图片
关注公众号,领取更多资源

本文为博主原创文章,未经博主允许不得转载。

评论

发表评论