[python] 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'])

이 단순한 코드는 다음 오류를 반환합니다.

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 코드는 문제를 해결합니다.

포트가 지정되지 않은 경우 지정된 호스트의 포트 9200에 연결을 시도하고 시간 초과 후 실패합니다.


답변

이것은 시간 제한을 30 초로 늘리는 것과 관련이 없습니다. 사람들은 실제로 탄력적 검색이 작은 히트 하나를 반환하는 데 최대 30 초가 필요하다고 생각합니까?

이 문제를 해결 한 방법은 config / elasticsearch.yml 로 이동
하여 다음 주석을 제거하는 것입니다.

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

Network.host는 192.168.0.1로 설정되어 작동 할 수 있지만 방금 ‘localhost’로 변경했습니다.


답변

수행 es.search(또는 es.index) 할 때 시간 초과의 일반적인 이유 중 하나 는 큰 쿼리 크기입니다. 예를 들어, 상당히 큰 ES 인덱스 크기 (> 3M 문서)의 경우 30 개 단어가 포함 된 쿼리를 검색하는 데 약 2 초가 걸리고 400 단어가 포함 된 쿼리를 검색하는 데 18 초 이상이 걸렸습니다. 따라서 충분히 큰 쿼리의 경우 timeout = 30으로도 저장되지 않습니다. 쉬운 해결책은 시간 제한 아래에 응답 할 수있는 크기로 쿼리를 자르는 것입니다.

시간 초과를 늘리거나 시간 초과시 재 시도하면 원인이 트래픽에있는 경우 도움이되고 그렇지 않으면 이것이 원인 일 수 있습니다.


답변

elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10))
요청이 지정된 시간에 종료되지 않았 음을 의미합니다 (기본적으로 timeout = 10).

30 초 동안 작동합니다.

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


답변

Elasticsearch 초기화에서 시간 제한을 설정해보십시오.

es = Elasticsearch([{'host': HOST_ADDRESS, 'port': THE_PORT}], timeout=30)

당신은 설정할 수 있습니다 retry_on_timeoutTrue와 줄 max_retries옵션 수를 :

es = Elasticsearch([{'host': HOST_ADDRESS, 'port': THE_PORT}], timeout=30, max_retries=10, retry_on_timeout=True)


답변

내 개인적인 문제는 (timeout = 10000)서버의 항목이 7.000에 불과했지만 트래픽이 많고 리소스가 많이 소모되어 거의 도달하지 못했던 문제가 해결되었습니다.