원래는 java 기반으로 high level client를 사용하거나 springboot elastic을 사용하는데, 구글 트렌드 api를 사용하다 보니 python을 기반으로 api를 연동하게 되었다. ElasticSearch는 공식문서가 굉장히 잘 되어 있는 편이다.
공식 document를 보고 개발하면 편하다.
이번 포스팅에는 python - ElasticSearch를 연결하고 index에 색인하는 것까지 진행해보고자 한다.
[환경 구성]
- jdk 11
- ElasticSearch version 7.12.1
- python 3
[Code]
1. Elasticsearch install
Elasticsearch 라이브러리가 설치되어 있지 않다면 pip 명령어로 설치해줘야 한다.
pip install elasticsearch
이 때, elasticsearch version 문제가 있을 수 있으니 꼭 사용하고자 하는 버전과 일치하는지 확인이 필요😀
(근데 리눅스 서버에 7.12.1를 설치했지만, 7.17.0 버전 라이브러리를 설치했음에도 잘 되었다! 아마 version 7이 같았기 때문이 아닐까 추측을 해본다.)
2. Index 색인하기
from elasticsearch import Elasticsearch
client = Elasticsearch('127.0.0.1:9200')
client.info()
Elasticsearch 라이브러리를 import 해주고, 설치가 되어있는 주소 (localhost:9200, serverIP:9200 등)을 작성해주면 된다.
info() 함수는 elasticsearch 정보를 나타내 준다.
※ 공식문서
https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/overview.html
Overview | Elasticsearch Python Client [7.16] | Elastic
All the API calls map the raw REST API as closely as possible, including the distinction between required and optional arguments to the calls. This means that the code makes distinction between positional and keyword arguments; we, however, recommend that
www.elastic.co
https://elasticsearch-py.readthedocs.io/en/v7.17.0/
Python Elasticsearch Client — Elasticsearch 7.17.0 documentation
This client was designed as very thin wrapper around Elasticsearch’s REST API to allow for maximum flexibility. This means that there are no opinions in this client; it also means that some of the APIs are a little cumbersome to use from Python. We have
elasticsearch-py.readthedocs.io
[Python - Elastic 연결 시 NewConnection Error 발생]
공식문서대로 개발했음에도 불구하고 계속해서 NewConnection Error가 발생하였다. 꽤 오랫동안 헤매다가 원인을 찾고는 완전 아차차 해 버렸다. 누구나 놓칠 수 있는 실수인데도, 다들 잘하시는지 에러 관련된 내용도 잘 설명이 없었다.
※ 발생한 에러
ConnectionError: ConnectionError(<urllib3.connection.HTTPConnection object at 0x7fde18323950>: Failed to establish a new connection: [Errno 111] Connection refused) caused by: NewConnectionError(<urllib3.connection.HTTPConnection object at 0x7fde18323950>: Failed to establish a new connection: [Errno 111] Connection refused)
말 그대로 ConnectionError... 연결되지 않았다는 뜻이다.
분명 elasticsearch를 잘 설치하였고, 심지어 서비스 운영 중인데도 찾을 수가 없다니ㅠ
stack overflow를 보고 알았는 내용. 이 에러는 정확한 포트 정보, 아이피 정보를 작성하지 않았기 때문에 발생한 에러이다.
python의 Elasticsearch library는 단순히 python과 elastic을 연결해 주는 라이브러리이다. 따라 elasticsearch에서 외부 네트워크가 잘 설정되었는지, 방화벽 오픈이 되어있는지 꼭 확인을 해주면 된다.
💡 참고 stackoverflow : https://stackoverflow.com/questions/39447617/failed-to-establish-a-new-connection-errno-111-connection-refusedelasticsear
💡 elasticsearch/bin/elasticsearch.yml에서 network ip 설정해주면 된다!
직접 공부하여 작성한 내용입니다.
잘못된 부분 혹은 추가적인 내용이 있으면 알려주세요☺