web-dev-qa-db-fra.com

Délai de connexion avec 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'])

Ce code simple renvoie l'erreur suivante:

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

Très étrange, car le serveur est prêt et configuré ( http: // localhost: 9200/ renvoie un fichier json).

Merci d'avance!

49
Johann Gomes

Par défaut, le délai d'attente est défini sur 10 secondes. Si vous souhaitez modifier la valeur du délai d'expiration global, vous pouvez le faire en définissant l'indicateur timeout = votre heure lors de la création de l'objet.

Si vous avez déjà créé l'objet sans spécifier la valeur de délai d'attente, vous pouvez définir la valeur de délai d'attente pour une requête particulière en utilisant request_timeout = your-time flag dans la requête.

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

Un problème de délai de connexion peut survenir si vous utilisez le service Amazon Elastic Search.

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

Le code python ci-dessus, dans lequel vous substituez le port par défaut de 9200 à 443 et définissez ssl sur true, résoudra le problème.

Si aucun port n'est spécifié, il essaie de se connecter à pprt 9200 dans l'hôte spécifié et échoue après l'expiration du délai

7
Mukund

Cela n’a rien à voir avec l’augmentation de votre délai d’attente à 30 secondes ... Est-ce que les gens pensent réellement que la recherche élastique devrait avoir besoin de 30 secondes au maximum pour obtenir un résultat minuscule?

La façon dont j'ai résolu ce problème était d'aller dans config/elasticsearch.yml Commenter ce qui suit

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

Network.Host pourrait être défini sur 192.168.0.1, ce qui pourrait fonctionner, mais je viens de le changer en "localhost" 

5
whoopididoo

mon problème personnel a été résolu avec (timeout = 10000) qui n'a pratiquement jamais été atteint car les entrées sur le serveur n'étaient que de 7 000, mais le trafic était important et les ressources étaient saturées. 

0
Evan

Notez que l'une des raisons courantes pour les délais d'attente lorsque vous utilisez es.search (ou es.index) est la taille de la requête importante. Par exemple, dans le cas d’une taille d’index ES assez importante (documents> 3M), la recherche d’une requête de 30 mots prenait environ 2 secondes, tandis que celle d’une requête de 400 mots prenait plus de 18 secondes. Donc, pour une requête suffisamment grande, même timeout = 30 ne vous sauvera pas. Une solution simple consiste à recadrer la requête à la taille à laquelle il est possible de répondre en dessous du délai d'attente.

Augmenter le timeout ou faire de nouvelles tentatives sur timeout vous aidera si la cause était dans la circulation, sinon cela pourrait être votre coupable.

0
vlyubin