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)。
提前致谢!
答案 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)
两个有用的选项:
设置超时为我解决了这个问题。请注意,较新的版本需要一个单位,例如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')
它也有助于减少文本长度,例如通过剪切长文本,因此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
});