2015-02-02 10 views
29
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']) 

Dieser simples Code den folgenden Fehler zurückgibt:Connection Timeout mit Elasticsearch

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

Sehr seltsam, weil der Server bereit und eingestellt ist (http://localhost:9200/ etwas json zurückkehrt).

Vielen Dank im Voraus!

Antwort

0

elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10)) bedeutet, dass die Anforderung nicht in der angegebenen Zeit endete (standardmäßig ist Timeout = 10).

Dies wird mit 30 Sekunden arbeiten:

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

26

Standardmäßig wird der Timeout-Wert auf 10 Sekunden eingestellt. Wenn Sie den globalen Zeitüberschreitungswert ändern möchten, können Sie dies erreichen, indem Sie beim Erstellen des Objekts das Flag timeout = your-time setzen.

Wenn Sie das Objekt bereits ohne Angabe des Zeitüberschreitungswerts erstellt haben, können Sie den Zeitüberschreitungswert für eine bestimmte Anforderung mithilfe des Flags request_timeout = your-time in der Abfrage festlegen.

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

Kann dies auf 60 gesetzt werden? Ich bekomme eine Zeitüberschreitung, auch nachdem ich es eingestellt habe 30 – Kishan

+0

@Kishan Wie groß ist dein Körper des Doc? –

+0

Hallo, @RohitPatwa mein Problem wurde gelöst, indem die Länge des Dokuments reduziert. Ich kann mich nicht erinnern, wie groß der Körper gerade war. Danke für die Hilfe :) – Kishan

6

Das Problem mit der Verbindungszeitüberschreitung konnte auftreten, wenn Sie den Amazon Elastic Search-Dienst verwenden.

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

Die oben Python-Code, bei dem Sie den Standardport von 9200 auf 443 überschreiben und das SSL auf "true" setzen, löst das Problem.

Wenn kein Port angegeben ist, wird er versuchen, die PPRT 9200 in dem angegebenen Host zu verbinden und nicht nach der Zeit aus

2

Das hat nichts mit der Steigerung ihre Timeout auf 30 Sekunden zu tun. Denken die Leute tatsächlich, dass die elastische Suche bis zu 30 Sekunden benötigen sollte, um einen winzigen Treffer zurückzugeben?

Die Art, wie ich dieses Problem behoben war Config-go/elasticsearch.yml Kommentar- der folgenden

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

Network.host könnte auf 192.168.0.1 gesetzt werden, die funktionieren könnte Aber ich änderte es nur zu 'localhost'

+3

Wenn der Server zu beschäftigt ist, ja, können Sie diesen Fehler mit einem winzigen Treffer haben. –