使用Elasticsearch进行连接超时

时间:2015-02-02 21:39:20

标签: python python-2.7 elasticsearch

from datetime import datetime
from elasticsearch import Elasticsearch
es = Elasticsearch()

doc = {
    'author': 'kimchy',
    'text': 'Elasticsearch: cool. bonsai cool.',
    'timestamp': datetime(2010, 10, 10, 10, 10, 10)
}
res = es.index(index="test-index", doc_type='tweet', id=1, body=doc)
print(res['created'])

此简单代码返回以下错误:

elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10))

非常奇怪,因为服务器已准备就绪并已设置(http://localhost:9200/正在返回一些json)。

提前致谢!

11 个答案:

答案 0 :(得分:56)

默认情况下,超时值设置为10秒。如果想要更改全局超时值,可以通过在创建对象时设置标志 timeout = your-time 来实现。

如果您已经创建了对象而未指定超时值,则可以在查询中使用 request_timeout = your-time 标记设置特定请求的超时值。

es.search(index="my_index",
          doc_type="document",
          body=get_req_body(),
          request_timeout=30)

答案 1 :(得分:8)

如果您使用的是Amazon Elastic Search服务,则可能会出现连接超时问题。

es = Elasticsearch([{'host':'xxxxxx.us-east-1.es.amazonaws.com','port':443,'use_ssl':True}])

上面的python代码,您将默认端口从9200覆盖到443并将ssl设置为true将解决此问题。

如果未指定端口,则它尝试连接到指定主机中的pprt 9200,并在超时后失败

答案 2 :(得分:6)

这与将超时增加到30秒无关。 人们真的认为弹性搜索需要长达30秒的时间来返回一个微小的命中吗?

我解决此问题的方法是转到 config / elasticsearch.yml 取消注释以下

http.port: 9200
network.host: 'localhost' 

Network.host可能设置为192.168.0.1可能有效但我只是将其更改为' localhost'

答案 3 :(得分:4)

尝试在Elasticsearch初始化中设置超时:

es = Elasticsearch([{'host': HOST_ADDRESS, 'port': THE_PORT}], timeout=30)

您甚至可以将retry_on_timeout设置为True并为max_retries指定一个可选数字:

es = Elasticsearch([{'host': HOST_ADDRESS, 'port': THE_PORT}], timeout=30, max_retries=10, retry_on_timeout=True)

答案 4 :(得分:1)

elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10)) 表示请求未在指定时间内结束(默认情况下,超时= 10)。

这将使用30秒:

res = es.index(index="test-index", doc_type='tweet', id=1, body=doc, timeout=30)

答案 5 :(得分:1)

发生超时的原因可能很多,看来值得检查Elasticsearch一侧的日志logs/elasticsearch.log)以查看详细的错误。在我们的案例中,ES上的错误是:

primary shard is not active Timeout: [1m]

如本post中所述,这是因为我们的磁盘已满。一天前,我们已经调整了它(和分区)的大小以解决此问题,但是如果高/低水位线被击中一次(我们位于5.5.x上)而我们没有做过,则需要重新启动ES。

仅在生产中重新启动ES即可为我们解决该问题。

答案 6 :(得分:0)

我的个人问题得到了(timeout = 10000)的解决,因为服务器上的条目仅为7.000,但流量却很大,而且资源被占用,这实际上从未实现,这就是连接断开的原因

答案 7 :(得分:0)

请注意,执行es.search(或es.index)时超时的常见原因之一是查询量大。例如,在我的ES索引很大(> 3M文档)的情况下,用30个单词的查询进行搜索大约需要2秒钟,而用400个单词的查询进行搜索需要18秒钟以上。因此,对于足够大的查询,甚至超时= 30也无法挽救您。一种简单的解决方案是将查询裁剪为在超时以下可以回答的大小。

如果原因在流量中,增加超时时间或重试超时将对您有所帮助,否则可能是您的罪魁祸首。

答案 8 :(得分:0)

两个有用的选项:

1:增加超时时间

设置超时为我解决了这个问题。请注意,较新的版本需要一个单位,例如timeout="60s"

es.index(index=index_name, doc_type="domains", id=domain.id, body=body, timeout="60s")

没有单位,例如通过设置timeout=60,您将获得

elasticsearch.exceptions.RequestError: RequestError(400, 'illegal_argument_exception', 'failed to parse setting [timeout] with value [60] as a time value: unit is missing or unrecognized')

2:减少文本长度

它也有助于减少文本长度,例如通过剪切长文本,因此elastic可以更快地存储文本,这也可以避免超时:

es.index(index=index_name, doc_type="domains", id=domain.id, body=text[:5000], timeout="60s")

答案 9 :(得分:0)

我在 ubuntu 的 9202 端口(9200 正在被 elasticsearch 7.11.1 使用)尝试 apt install(使用 elasticsearch 6 安装)时遇到这个超时问题。

我在谷歌上搜索了将近两个小时才最终修复它。原来我需要在 /etc/elasticsearch/elasticserch.yml

中设置(注释掉)一行
cluster.initial_master_nodes: ["node-1"]  # earlier in the same file: node.name: node-1 

我希望这可以帮助某人。

答案 10 :(得分:0)

扩展 requestTimeout

client = new elasticsearch.Client({
        host          : 'http://localhost:9200',
        requestTimeout: 60000
    });