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を返しています)。
デフォルトでは、タイムアウト値は10秒に設定されています。グローバルタイムアウト値を変更する場合、オブジェクトの作成中にフラグtimeout = your-timeを設定することでこれを実現できます。
タイムアウト値を指定せずにオブジェクトをすでに作成している場合は、クエリでrequest_timeout = your-timeフラグを使用して、特定のリクエストのタイムアウト値を設定できます。
es.search(index="my_index",
doc_type="document",
body=get_req_body(),
request_timeout=30)
Amazon Elastic Searchサービスを使用している場合、接続タイムアウトの問題が発生する可能性があります。
es = Elasticsearch([{'Host': 'xxxxxx.us-east-1.es.amazonaws.com'、 'port':443、 'use_ssl':True}])
デフォルトのポートを9200から443にオーバーライドし、sslをtrueに設定する上記のpythonコードは、問題を解決します。
ポートが指定されていない場合、指定されたホストのpprt 9200への接続が試行され、タイムアウト後に失敗します
これは、タイムアウトを30秒に増やすこととは関係ありません。エラスティック検索は、1回の小さなヒットを返すのに最大30秒必要だと実際に考えていますか?
私がこの問題を修正した方法は、config/elasticsearch.ymlのコメントを外すことでした。
http.port: 9200
network.Host: 'localhost'
Network.Hostは192.168.0.1に設定される可能性がありますが、動作する可能性がありますが、「localhost」に変更しました
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)
私の個人的な問題は(timeout = 10000)
で解決されました。サーバー上のエントリはわずか7,000でしたが、トラフィックが多く、リソースが大量に消費され、接続が切断されたため、実際には到達しませんでした
es.search
(またはes.index
)を実行する際のタイムアウトの一般的な理由の1つは、クエリサイズが大きいことに注意してください。たとえば、ESインデックスサイズが非常に大きい(3Mを超えるドキュメント)場合、30ワードのクエリの検索には約2秒かかり、400ワードのクエリの検索には18秒以上かかりました。そのため、十分に大きなクエリの場合、timeout = 30でも保存されません。簡単な解決策は、タイムアウト以下で回答できるサイズにクエリをトリミングすることです。
タイムアウトを増やすか、タイムアウトで再試行することは、原因がトラフィックにある場合に役立ちます。そうでない場合、これが原因である可能性があります。