4、Delete By Query API

_delete_by_query API可以删除某个匹配条件的文档:

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

query字段的语法规则和 Search API一样。你也可以传递和search API一样的q参数

返回结果:

{
  "took" : 147,
  "timed_out": false,
  "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,
  "total": 119,
  "failures" : [ ]
}

_delete_by_query 在查找的时候会先获取索引的快照,并删除那些使用内部版本类型的文档。这意味着如果文档在获取快照和处理删除请求之间被修改了,就会造成版本号冲突。

当版本匹配时,文档将被删除。

因为内部版本不支持0,所以使用_delete_by_query将无法删除版本号为0的文档。

_delete_by_query 执行期间,会分多次顺序查询要删除的文档。每次查询完之后就会使用批处理一次性删除本批次的文档。如果在这个过程中的某次搜索或删除操作失败,默认会重试10次(速度呈指数下降)。当重试次数达到最大值的时候,_delete_by_query操作就会终止,并在响应中返回所有失败(failures字段)信息。已经执行的删除操作依然是生效的。换句话说,这个处理过程是不会回滚的,只会中止。因此其中的一些文档有可能删除失败。

如果你不想因为版本冲突导致操作中断,你可以在url中设置conflicts=proceed或者在请求体中设置conflicts:proceed

下例将删除twitter索引里面的所有tweets:

POST twitter/_doc/_delete_by_query?conflicts=proceed
{
  "query": {
    "match_all": {}
  }
}

你也可以一次删除多个索引和多个类型的文档:

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

如果你提供routing参数,该参数会被放在到scroll查询中,只删除满足routing条件的分片中的文档。

POST twitter/_delete_by_query?routing=1
{
  "query": {
    "range" : {
        "age" : {
           "gte" : 10
        }
    }
  }
}

默认情况下,_delete_by_query使用scroll query api查询1000个文档,你可以指定scroll_size参数来修改它:

POST twitter/_delete_by_query?scroll_size=5000
{
  "query": {
    "term": {
      "user": "kimchy"
    }
  }
}

4.1 URL参数(URL Parameters)

_delete_by_query API 同样支持refresh, wait_for_completion, wait_for_active_shards,timeoutscrollpretty等参数。

  • refresh参数

    • 执行完删除操作后刷新_delete_by_query中查询涉及的分片。与delete API不同,delete API只会刷新接收到删除请求的分片。refresh参数不支持wait_for。
  • wait_for_completion
    • 如果请求中wait_for_completion=false,那么elasticsearch将会执行预检查、执行请求,然后返回可与任务API一起使用的任务,以取消或获取任务的状态。elasticsearch还将在.task/task/${taskId}处创建此任务的记录文档。您可以根据需要保留或删除该文档。用完删除后,elasticsearch可以回收其占用的空间。
  • wait_for_active_shards
    • 控制在执行请求前需要有几个可用的分片数。
  • timeout
    • 控制每个请求等待分片从不可用状态到可用状态的时间。因为_update_by_query 使用滚动搜索,所以可以指定 scroll 参数来控制它使 “搜索上下文” 保持活动的时间,例如:scroll=10m。默认情况下,它是 5 分钟。
  • request_per_second
    • 可以设置成任意正数(如1.4,6,1000等),通过设置等待的时间来控制_delete_by_query批量操作执行删除操作的速率。设置requests_per_second设置为-1表示停用该限制。

速率限制是通过在批量处理之间等待来完成的,这样就可以为_delete_by_query内部使用的回滚指定一个考虑填充的超时时间。填充时间是批处理大小除以requests_per_second与写入时间只差。默认情况下,批处理大小为1000,因此如request_per_second设置为500:

target_time = 1000 / 500 per second = 2 seconds
wait_time = target_time - write_time = 2 seconds - .5 seconds = 1.5 seconds

由于该批操作是通过_bulk请求发出的,因此大批量的请求将导致ElasticSearch创建多个请求,然后在启动下一个集合之前等待一段时间。这是“突发”而不是“平稳”。默认值为-1。

4.2 响应体(Response body)

{
  "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 by query 操作时出现超时,那么这个标识将会返回true
  • total
    • 成功执行操作的文档的数量
  • deleted
    • 成功的删除了多少个文档
  • batches
    • 回滚数
  • verison_conflicts
    • 操作过程中出现版本冲突的数量
  • noops
    • 执行_delete_by_query时这个值始终是0,之所以存在是因为_delete_by_query、update_by_query、reindex APIs都返回相同的响应结构。
  • retries
    • 重复尝试的次数,bulk 是批量更新操作重复尝试的次数,search 是查询的重复尝试次数
  • throthled_millis
    • requests_per_second 参数引起的请求等待时间
  • requests_per_second
    • 在操作过程中,每秒执行的请求数
  • throttled_until_millis
    • 执行_delete_by_query时这个值始终0,只在在调用Task API时该值才有意义,它表示下一次(自纪元以来)为了符合requests_per_second,将再次执行请求的毫秒数。
  • failures
    • 执行失败的数组,包含在执行过程中任何不可恢复的错误。如果这个数组不是空的,那么请求会因为这些失败而中止。_delete_by_query是使用批处理实现的,任何失败都会导致整个执行被中止。可以使用conflicts参数来防止reindex在版本冲突时造成操作中止。

4.3 结合taskAPi使用(Works with the Task API)

您可以使用Task API获取任何正在进行_delete_by_query请求的状态:

GET _tasks?detailed=true&actions=*/delete/byquery

返回值:

{
  "nodes" : {
    "r1A2WoRbTwKZ516z6NEs5A" : {
      "name" : "r1A2WoR",
      "transport_address" : "127.0.0.1:9300",
      "host" : "127.0.0.1",
      "ip" : "127.0.0.1:9300",
      "attributes" : {
        "testattr" : "test",
        "portsfile" : "true"
      },
      "tasks" : {
        "r1A2WoRbTwKZ516z6NEs5A:36619" : {
          "node" : "r1A2WoRbTwKZ516z6NEs5A",
          "id" : 36619,
          "type" : "transport",
          "action" : "indices:data/write/delete/byquery",
          "status" : {
            "total" : 6154,
            "updated" : 0,
            "created" : 0,
            "deleted" : 3500,
            "batches" : 36,
            "version_conflicts" : 0,
            "noops" : 0,
            "retries": 0,
            "throttled_millis": 0
          },
          "description" : ""
        }
      }
    }
  }
}

status:这个对象包含了当前任务的实际状态。total字段是本次操作需要重新索引的文档数。你可以通过updated, created, and deleted字段估计处理进度。当以上几个字段的和等于total字段时,请求就执行完毕了。

你可以使用 task id 查看某个任务。下例查看task id为 r1A2WoRbTwKZ516z6NEs5A:36619的任务信息:

GET /_tasks/r1A2WoRbTwKZ516z6NEs5A:36619

如果在执行delete_by_query的时候指定了wait_for_completion=false参数,就可以通过该API查看任务的执行情况。

该 API 可以与wait_for_comletion=false集成使用,可以清晰的查看已完成任务的状态。如果任务已经完成,并且在其上设置了wait_for_completion=false,那么请求将会返回结果或是错误字段。此功能的代价是当wait_for_completion=false时会在.tasks/task/${taskId}目录下会创建文档。您可以根据需要删除该文档。

4.4 取消任务(Works with the Cancel Task API)

任何delete_by_query操作都可以通过task cancel API来取消,如:

POST _tasks/r1A2WoRbTwKZ516z6NEs5A:36619/_cancel

取消应该执行很快,但可能需要几秒钟。在此期间上面的 task status API将继续列出该任务,直到它完全被取消了。

4.5 阈值(Rethrottling)

在正在执行的请求中,requests_per_second的值可以在运行时通过_rethrotted API进行修改:

POST _delete_by_query/r1A2WoRbTwKZ516z6NEs5A:36619/_rethrottle?requests_per_second=-1

可以使用tasks API找到任务ID。

4.6 切片(slicing)

delete_by_query 支持 sliced scroll 来使删除操作并行进行,这能提高效率并且提供了一种将请求分解为较小的部分的便捷方式。

4.6.1 手动切片(Manually slicing)

通过为每个请求提供切片ID和切片总数,手动将_delete_by_query 操作进行分解:

POST twitter/_delete_by_query
{
  "slice": {
    "id": 0,
    "max": 2
  },
  "query": {
    "range": {
      "likes": {
        "lt": 10
      }
    }
  }
}
POST twitter/_delete_by_query
{
  "slice": {
    "id": 1,
    "max": 2
  },
  "query": {
    "range": {
      "likes": {
        "lt": 10
      }
    }
  }
}

你可以这样验证上述api的结果:

GET _refresh
POST twitter/_search?size=0&filter_path=hits.total
{
  "query": {
    "range": {
      "likes": {
        "lt": 10
      }
    }
  }
}

返回如下的的结果:

{
  "hits": {
    "total": 0
  }
}

4.6.2 自动切片(Automatic slicing)

也可以让delete by query 自动并行地滚动切片。使用slices 指定要使用的切片数:

POST twitter/_delete_by_query?refresh&slices=5
{
  "query": {
    "range": {
      "likes": {
        "lt": 10
      }
    }
  }
}

你可以这样验证上述api的结果:

POST twitter/_search?size=0&filter_path=hits.total
{
  "query": {
    "range": {
      "likes": {
        "lt": 10
      }
    }
  }
}

返回如下的的结果:

{
  "hits": {
    "total": 0
  }
}

slices 设置为 auto 将允许 ElasticSearch 选择要使用的切片数。此设置将使用一个分片一个切片,直至达到某个限制。如果存在多个源索引,它将根据具有最少分片的那个索引所拥有的分片数来作为切片数。

向_delete_by_query添加slices 只会自动执行上一节中使用的手动过程,这意味着它有一些怪癖:

  • 您可以在 Tasks API 中查看这些请求。这些子请求是具有slices 请求的任务的“子"任务。
  • 仅使用slices 获取请求的任务状态(包含已完成切片的状态)。
  • 这些子请求可单独寻址,例如取消和重新限制。
  • 使用slices 重新处理请求将按比例重新调整未完成的子请求。
  • 使用slices 取消请求将取消每个子请求。
  • 由于slices 的性质,每个子请求都不会获得完全均匀的文档部分。这些切片文档都会被处理,但某些切片可能比其他切片分到更大的文档。
  • requests_per_second 这样的参数和带有sizeslices请求(按指定比例分配给每个子请求)。将其与上述关于分布不均匀的点相结合,您应该得出结论,使用slicessize可能不会删除指定大小的文档。
  • 每个子请求都会获得和源索引略有不同的快照,尽管这些快照几乎同时进行。

4.6.3 选择切片的数量(Picking the number of slices)

如果设置 slices 为自动切片,elasticsearch 将为大多数索引选择一个合理的数量。如果您是设置手动切片或以其他方式来调整自动切片,请使用以下准则:

当切片的数量等于索引的分片数时,查询性能最好。如果这个数量太大(如 500), 请选择一个较小的数字,因为太多的切片会影响性能。设置高于分片数的切片通常不会提高效率反而会增加开销。

删除的性能与可用的切片数量呈正相关。

查询或删除是否是影响此时运行时性能的主要原因,这取决于reindexed时的文档和集群的资源。

elasticsearch6.7 05. Document APIs(5)Delete By Query API的更多相关文章

  1. elasticsearch6.7 05. Document APIs(7)Update By Query API

    6.Update By Query API _update_by_query 接口可以在不改变 source 的情况下对 index 中的每个文档进行更新.这对于获取新属性或其他联机映射更改很有用.以 ...

  2. elasticsearch6.7 05. Document APIs(4)Delete API

    3.Delete API delete API 可以让你删除一个特定id的文档,下面例子删除twitter索引中_doc类型.id为1的文档: DELETE /twitter/_doc/1 返回结果: ...

  3. elasticsearch6.7 05. Document APIs(2)Index API

    Single document APIs Index API Get API Delete API Update API Multi-document APIs Multi Get API Bulk ...

  4. elasticsearch6.7 05. Document APIs(10)Reindex API

    9.REINDEX API Reindex要求为源索引中的所有文档启用_source. reindex 不会配置目标索引,不会复制源索引的设置.你需要在reindex之前先指定mapping,分片数量 ...

  5. elasticsearch6.7 05. Document APIs(6)UPDATE API

    5. UPDATE API 更新操作可以使用脚本来更新.更新的时候会先从索引中获取文档数据(在每个分片中的集合),然后运行脚本(使用可选的脚本语言和参数),再果进行索引(还允许删除或忽略该操作).它使 ...

  6. elasticsearch6.7 05. Document APIs(9)Bulk API

    8.Bulk API 可以把多个index或delete操作放在单个bulk API中执行.这样可以极大地提高索引速度. /_bulkAPI使用如下的JSON结构: action_and_meta_d ...

  7. elasticsearch6.7 05. Document APIs(8)Multi Get API

    7.Multi Get API(Multi Get API) multi GET API 允许你一次性获取多个文档,你需要指定docs数组,其中包含了所有你需要查询的文档,每个查询结构至少包含索引,类 ...

  8. elasticsearch6.7 05. Document APIs(3)GET API

    2.GET API get API 可以通过文档id从索引中获取json格式的文档,以下示例从twitter索引中获取type为_doc,id值为0为的JSON文档: GET twitter/_doc ...

  9. elasticsearch6.7 05. Document APIs(1)data replication model

    data replication model 本节首先简要介绍Elasticsearch的data replication model,然后详细描述以下CRUD api: 1.读写文档(Reading ...

随机推荐

  1. http错误代码提示

    1×× 保留 2×× 表示请求成功地接收 3×× 为完成请求客户需进一步细化请求 4×× 客户错误 5×× 服务器错误 200  正常:请求已完成.  201  正常:紧接 POST 命令.  202 ...

  2. std::string的拷贝赋值研究

    说明:以下涉及的std::string的源代码摘自4.8.2版本.结论:std::string的拷贝复制是基于引用计数的浅拷贝,因此它们指向相同的数据地址. // std::string类定义type ...

  3. 运行第一个Python程序

    Python的三种运行方式 交互式解释器 在终端输入python3 进入python交互式解释器 输入exit()退出交互式解释器 命令行脚本 创建python脚本 通过命令执行程序 python h ...

  4. Vuejs——(4)v-if、v-for

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   (二十)v-if ①标准v-if用法 简单来说,该值为true则显示该标签,为false则不显示 ...

  5. nginx的权限问题(13: Permission denied)解决办法

    一个nginx带多个tomcat集群环境,老是报如下错误:   2012/03/07 15:30:39 /opt/nginx/proxy_temp/4/31/0000000314" fail ...

  6. .NET Core微服务之路:文章系列和内容索引汇总 (v0.52)

    微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑,包含微服务核心组件如 1. Eureka:实现服务注册与发现. 2. ...

  7. 4.ASP.NET MVC 5.0 视图之模型绑定

    大家好,这篇文章,我将向大家介绍ASP.NET MVC的模型视图绑定,ASP.MVC的模型绑定分为两种:一种是动态绑定[Dynamic Binding];还有一种就是强类型绑定[Strongly ty ...

  8. Git使用01

    git 工作区:当前编辑的区域 缓存区:add 之后的区域 本地仓库:commit之后的区域 远程仓库:远程的区域 git init 初始化 git status 查看git的状态 git add 将 ...

  9. 牛客JS编程大题(二)

    11.统计数组 arr 中值等于 item 的元素出现的次数 function count(arr, item) { var num = 0; for(var i = 0;i < arr.len ...

  10. Matlab实现《追光者》简谱

    MATLAB除了生孩子,其他全都能做系列. 使用MATLAB进行播放<追光者>,纯文本内容哦. Fs = ; load y; sound(y, Fs); 加载的y是哪里来的呢?当然是调用函 ...