【问题标题】:Trouble setting request specific timeout in Elasticsearch DSL在 Elasticsearch DSL 中设置请求特定超时的问题
【发布时间】:2016-01-06 09:23:01
【问题描述】:

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

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_dsldocs我什至尝试设置默认连接超时:

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

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

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

【问题讨论】:

    标签: python elasticsearch elasticsearch-dsl


    【解决方案1】:

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

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

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

    【讨论】:

    • 参数 timeout=30 给出以下错误:TransportError(400, 'parse_exception', 'Failed to parse setting [timeout] with value [30] as a time value: unit is missing or unrecognized')。您应该改用 request_timeout=30
    • @coda,你确定是这样吗?也许只是因为它以某种方式被缓存。您是重复搜索,还是搜索不同的内容?
    猜你喜欢
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多