我尝试使用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秒超时错误。
答案 0 :(得分:4)
因此,出于某种原因,通过.params()
添加参数似乎可以解决问题:
s = Search(using=client,
index= 'my_index',
doc_type=['my_type'])
.params(request_timeout=30)
真正有趣的部分是查询现在运行不到一秒钟,索引只在一个节点上。