我将搜索查询的超时设置为10毫秒,因此我希望Elasticsearch搜索查询的超时应在10毫秒内。
在响应中,我确实得到了,"timed_out":true
但查询似乎没有超时。它仍然运行几百毫秒。
样本回复:
{
"took": 460,
"timed_out": true,
....
Run Code Online (Sandbox Code Playgroud)
这是预期的行为还是我在这里错过了一些东西?我的目标是终止查询,如果它花费的时间太长,以至于它不会对群集造成负担。
timeout
什么?timeout
从Elasticsearch指南中可以看到,以set 运行的Elasticsearch查询可能返回部分或空结果(如果超时已过期):
timeout参数告诉分片在将响应返回给协调节点之前允许它们处理数据的时间。如果没有足够的时间来处理所有数据,则该分片的结果将是部分的,甚至可能为空。
请求正文搜索参数的文档还告诉您:
超时
搜索超时,将搜索请求限制为在指定的时间值内执行,并且在到期之前累积到该点的命中项进行保释。默认为无超时。
有关更多详细信息,请参阅指南中的此页面。
看起来Elasticsearch并没有最终的答案,但是针对特定情况有几种解决方法。他们来了。
没有一种方法可以保护系统免受DoS攻击(截至2015年)。可以使用timeout
或terminate_after
查询参数来限制长时间运行的查询。terminate_after
就像,timeout
但是它计算每个分片的文档数。这两个参数都更像是对Elasticsearch的建议,这意味着某些长时间运行的查询仍可以经过所需的最大执行时间(例如script
,例如查询)。
从那时起,引入了任务管理API,并可以监视和取消长时间运行的任务。这意味着您将不得不编写一些其他代码来检查集群的运行状况并取消任务。
希望有帮助!