Elasticsearch超时为true但仍然得到结果

时间:2018-03-08 07:42:07

标签: elasticsearch

我将超时设置为我的搜索查询的10ms,所以我期望elasticsearch搜索查询应该在10ms内超时。

在回复中,我确实得到"timed_out":true,但查询似乎没有超时。它仍然会运行几百毫秒。

示例回复:

{
    "took": 460,
    "timed_out": true,
....

这是预期的行为还是我错过了什么?我的目标是终止查询,如果它花费的时间太长,以至于它不会在集群上加载。

1 个答案:

答案 0 :(得分:5)

对查询timeout的期望是什么?

使用timeout设置运行的Elasticsearch查询可能会从Elasticsearch Guide

返回部分或空结果(如果超时已过期)
  

timeout参数告诉分片允许多长时间   在将响应返回到协调节点之前处理数据。如果   没有足够的时间来处理所有数据,这个分片的结果   将是部分的,甚至可能是空的。

Request Body Search parameters的文档也说明了这一点:

  

<强>超时

     

搜索超时,限制要在其中执行的搜索请求   指定的时间值和保释结果累计到那个   到期时点。默认为无超时。

有关详细信息,请参阅指南中的this page

如何终止运行时间过长的查询?

看起来Elasticsearch没有最终的答案,而是针对特定情况的几种解决方法。他们在这里。

没有办法保护系统免受DoS攻击(截至year 2015)。使用timeoutterminate_after查询参数可以限制长时间运行的查询。 terminate_aftertimeout类似,但它会计算每个分片的文档数。这两个参数更像是对Elasticsearch的推荐,意味着一些长时间运行的查询仍然可以通过所需的最大执行时间(例如script查询)。

从那时起,Task Management API被引入,监控和取消长期运行的任务成为可能。这意味着您必须编写一些额外的代码来检查群集的运行状况并取消任务。

希望有所帮助!