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'])
Este código simple devuelve el siguiente error:
elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10))
Muy extraño, porque el servidor está listo y configurado ( http: // localhost: 9200 / está devolviendo algo de json).
python
python-2.7
elasticsearch
Johann Gomes
fuente
fuente

El problema de tiempo de conexión agotado podría ocurrir si está utilizando el servicio Amazon Elastic Search.
es = Elasticsearch([{'host': 'xxxxxx.us-east-1.es.amazonaws.com', 'port': 443, 'use_ssl': True}])El código de Python anterior en el que anula el puerto predeterminado de 9200 a 443 y establece el SSL en verdadero resolverá el problema.
Si no se especifica ningún puerto, está intentando conectarse al puerto 9200 en el host especificado y falla después del tiempo de espera
fuente
Esto no tiene nada que ver con aumentar el tiempo de espera a 30 segundos. ¿La gente realmente piensa que la búsqueda elástica debería necesitar hasta 30 segundos para devolver un pequeño acierto?
La forma en que solucioné este problema fue ir a config / elasticsearch.yml y descomentar lo siguiente
http.port: 9200 network.host: 'localhost'Network.host podría estar configurado en 192.168.0.1, lo que podría funcionar, pero lo acabo de cambiar a 'localhost'
fuente
Tenga en cuenta que una de las razones más comunes por las que se agota el tiempo de espera al realizar
es.search(oes.index) es un tamaño de consulta grande. Por ejemplo, en mi caso de un índice ES bastante grande (> 3M de documentos), realizar una búsqueda de una consulta con 30 palabras tomó alrededor de 2 segundos, mientras que realizar una búsqueda de una consulta con 400 palabras tomó más de 18 segundos. Entonces, para una consulta lo suficientemente grande, incluso el tiempo de espera = 30 no lo salvará. Una solución sencilla es recortar la consulta al tamaño que se pueda responder por debajo del tiempo de espera.Aumentar el tiempo de espera o hacer reintentos en el tiempo de espera le ayudará si la causa fue el tráfico; de lo contrario, este podría ser el culpable.
fuente
elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10))significa que la solicitud no terminó en el tiempo especificado (por defecto, tiempo de espera = 10).Esto funcionará con 30 segundos:
res = es.index(index="test-index", doc_type='tweet', id=1, body=doc, timeout=30)fuente
Intente configurar el tiempo de espera en la inicialización de Elasticsearch:
es = Elasticsearch([{'host': HOST_ADDRESS, 'port': THE_PORT}], timeout=30)Incluso puede configurar
retry_on_timeoutparaTruey dar almax_retriesun número opcional:es = Elasticsearch([{'host': HOST_ADDRESS, 'port': THE_PORT}], timeout=30, max_retries=10, retry_on_timeout=True)fuente
se resolvió mi problema personal con el
(timeout = 10000)que prácticamente nunca se alcanzó porque las entradas en el servidor eran solo 7.000 pero tenía mucho tráfico y sus recursos estaban siendo acaparados y por eso la conexión se estaba cayendofuente
Las razones del tiempo de espera pueden ser muchas y parece que vale la pena revisar los registros en el lado de elasticsearch (
logs/elasticsearch.log) para ver el error detallado. En nuestro caso, el error en ES fue:primary shard is not active Timeout: [1m]Como se describe en esta publicación , esto se debió a que nuestro disco estaba lleno. Lo habíamos redimensionado (y la partición) hace un día para encargarnos de eso, pero ES debe reiniciarse si la marca de agua alta / baja se ha tocado una vez (estamos en 5.5.x) lo cual no habíamos hecho.
Simplemente reiniciar el ES en producción nos resolvió el problema.
fuente
Dos opciones que ayudan:
1: aumenta el tiempo de espera
Establecer un tiempo de espera resolvió este problema para mí. Tenga en cuenta que las versiones más nuevas necesitan una unidad, por ejemplo
timeout="60s":es.index(index=index_name, doc_type="domains", id=domain.id, body=body, timeout="60s")Sin una unidad, por ejemplo
timeout=60, configurando , obtendrá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: reducir la longitud del texto
También ayuda a reducir la longitud del texto, por ejemplo, cortando textos largos, de modo que elástico pueda almacenar el texto más rápido, lo que también evitará tiempos de espera:
es.index(index=index_name, doc_type="domains", id=domain.id, body=text[:5000], timeout="60s")fuente