在Elasticsearch DSL中设置请求特定超时的麻烦

时间:2015-10-08 16:23:14

标签: python elasticsearch elasticsearch-dsl

我尝试使用timeout为特定请求设置elasticsearch_dsl。我尝试过以下方法:

from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search, F

...

def do_stuff(self, ids):
    client = Elasticsearch(['localhost'], timeout=30)
    s = Search(using=client,
               index= 'my_index',
               doc_type=['my_type'])
    s = s[0:100]
    f = F('terms', my_field=list(ids))
    s.filter(f)

    response = s.execute()
    return response.hits.hits

注意:

  • 当我将doc_type更改为包含一百万个实体的类型时,查询运行正常。
  • 当我将doc_type指向几十亿个实体时,我收到超时错误,显示默认超时为10秒。

来自elasticsearch_dsl docs我甚至尝试过设置默认连接超时:

from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search, F
from elasticsearch_dsl import connections

connections.connections.create_connection(hosts=['localhost'], timeout=30)

我仍然收到了10秒超时错误。

1 个答案:

答案 0 :(得分:4)

因此,出于某种原因,通过.params()添加参数似乎可以解决问题:

s = Search(using=client,
           index= 'my_index',
           doc_type=['my_type'])
    .params(request_timeout=30)

真正有趣的部分是查询现在运行不到一秒钟,索引只在一个节点上。