弹性搜索,delete_by_query需要很长时间才能完成并导致http请求超时

时间:2018-05-25 00:24:13

标签: elasticsearch

删除仍然有效,但服务器会抛出异常,因为它需要太长时间。在服务器端处理这个问题的最佳方法是什么?

delete_by_query api doc说它将返回一个任务,以便我可以跟踪删除进度。

如果请求包含wait_for_completion = false,则Elasticsearch将执行一些预检检查,启动请求,然后返回可与Tasks API一起使用的任务,以取消或获取任务的状态。 Elasticsearch还将在.tasks / task / $ {taskId}中创建此任务的记录作为文档。这是你的保留或删除你认为合适。完成后,删除它,以便Elasticsearch可以回收它使用的空间。

如何获得此任务ID?它不在HTTP响应中,也在超时场景中,甚至可能没有HTTP响应。

GET _tasks?detailed=true&actions=*/delete/byquery会返回一个删除任务列表,但我只想要一个任务。如果有两个任务正在运行,我怎么知道哪个是我要找的?

感谢。

1 个答案:

答案 0 :(得分:2)

Elasticsearch 6

创建任务:

nick@work:
curl -X POST "es-prices-ape:9200/prices /_delete_by_query?wait_for_completion=false" -H 'Content-Type: application/json' -d'
{
  "query": {
    "term": {
      "cella_id": "58259"
    }
  }
}
'

{"task":"GChf5jO9Q2Sti-Qi1G-oAw:12221137"}

获取任务信息:

nick@nick-home:~$ curl -X GET "es-prices-ape:9200/_tasks/{GChf5jO9Q2Sti-Qi1G-oAw:12221137}"

{"completed":true,"task":{"node":"GChf5jO9Q2Sti-Qi1G-oAw","id":12221137,"type":"transport","action":"indices:data/write/delete/byquery","status":{
"total" : 0,
"updated" : 0,
"created" : 0,
"deleted" : 0,
"batches" : 0,
"version_conflicts" : 0,
"noops" : 0,
....