Elasticsearch DSL中的故障设置请求特定超时

Jes*_*sse 6 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
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 当我将更doc_type改为包含一百万个实体的类型时,查询运行良好。
  • 当我将其指向doc_type数十亿个实体时,出现超时错误,显示默认超时为10秒。

elasticsearch_dsl 文档中,我什至尝试设置默认的连接超时:

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

connections.connections.create_connection(hosts=['localhost'], timeout=30)
Run Code Online (Sandbox Code Playgroud)

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

Jes*_*sse 8

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

s = Search(using=client,
           index= 'my_index',
           doc_type=['my_type'])
    .params(request_timeout=30)
Run Code Online (Sandbox Code Playgroud)

真正有趣的部分是查询现在只需不到一秒钟的时间即可运行,并且索引仅在单个节点上。

  • 参数** timeout = 30 **会给出以下错误:```TransportError(400,'parse_exception','无法以时间值[30]解析设置[timeout]:单位丢失或无法识别') ```。您应该改用** request_timeout = 30 **。 (3认同)