요약
- DB 데이터에 대한 효과적인 Text searching을 위한 보조 도구로써 솔루션의 기능을 확인한다.
본문
1. Elasticsearch 환경 구성
- 사이트 : https://www.elastic.co
- CentOS 6.x에서 RPM 소스 설치 테스트함
- Single Node일 경우, replica 0으로 세팅해야, Yellow 알람 발생 방지 (아키 구조적으로 생각할 것)
**
단일 서버에서 테스트 할 때, elasticsearch.yml 파일을 수정 방법이다.
# 외부 접근을 위한 수정 항목
network.host: <네트워크 인터페이스 주소>
http.port: 9200
# 노드 1개로 운영 시, "경고" 방지를 위한 복제본 0 설정 항목
index.number_of_replicas: 0
2. Elasticsearch Monitoring Tool.
- 사이트 : http://www.elastichq.org
- 플러그인 설치 : $ELASTICSEARCH_BIN/plugin -install royrusso/elasticsearch-HQ
- 접속 방법 : http://domain:port/_plugin/hq/
3. Elasticsearch의 python API
4. Elasticsearch와 "Postgresql의 Like 검색"의 성능 차이 확인 I (준비 작업)
코끼리에서 샘플 데이터 가지고 오기
In [1]:
# 자주 사용됨으로 미리 정의
conn_info = 'postgresql://user:password@host:port/database'
In [2]:
# 모듈 로딩
import pandas as pd
from sqlalchemy import create_engine
import json
# 샘플로 만들어둔 뉴스 문서 포멧의 10,000개의 문서들
e = create_engine(conn_info)
query = """
SELECT row_number() over () as id,* FROM blogger.elasticsearch_sample_data LIMIT 10000;
"""
%time df = pd.read_sql(query,e)
Elasticsearch로 넣기 위한 Json(with records type)으로 변환
In [3]:
# row_number()를 사용하지 않을때, Pandas에서 id 생성하기
#df['no'] = [ x+1 for x in df.index ]
# String to Json(Records Type) Format
%time json_rec = json.loads(df.to_json(orient = "records"))
Elasticsearch에 인덱싱하기
In [4]:
# Elasticsearch 모듈 로딩
from elasticsearch import Elasticsearch
es = Elasticsearch()
# 사용할 이름 정의
index_name = 'psql_to_es'
doc_type_name = 'psql_entity'
# Json 형태의 문서(doc)를 Elasticsearch로 넣기.
def json_to_es(json_rec):
for doc in json_rec:
es.index(index=index_name, doc_type=doc_type_name, id=doc['id'], body=doc)
%time json_to_es(json_rec)
In [5]:
# 샘플 데이터 확인 (추억의 조던 23번으로,)
es.get(index=index_name, doc_type=doc_type_name, id = 23)
Out[5]:
4. Elasticsearch와 "Postgresql의 Like 검색"의 성능 차이 확인 II (비교하기)
Elasticsearch에서 단어 조회 성능 확인
In [6]:
def find_terms_es():
res = es.search(index=index_name, body={"query": {"term": {'content':'부동산'}}})
return res
# 성능확인
%time out1 = find_terms_es()
In [7]:
# 수집 데이터 확인
print("Hits %d :" % out1['hits']['total'])
for hit in out1['hits']['hits'][0:2]:
print("%(gdate)s %(source)s: %(title)s" % hit["_source"])
postgresql에서 Like 검색을 통한 성능 확인
In [8]:
def find_terms_sql():
e = create_engine(conn_info)
query = """
SELECT gdate,source,title FROM blogger.elasticsearch_sample_data WHERE content like '%%부동산%%'
"""
return pd.read_sql(query,e)
# 성능확인
%time out2 = find_terms_sql()
In [9]:
# 수집 데이터 확인
print('Hits %d :' % out2.count()[0])
out2.head(2)
Out[9]:
덧 붙임말
- 결과 건수가 다른 부분은 있지만, 기대만큼의 성능 개선 부분이 확인 된다.
- 다음 번에는 자연어 처리 - 형태소 분석기를 붙여서, 완성도를 높인 자료를 만들어 보겠다.
비교 (사이즈, 응답시간) 결과 보기
Postgresql Like 검색 | Elasticsearch 검색 | |
10,000건 데이터 사이즈 | 35 MB | 94 MB |
검색 응답 시간 | 655 ms | 10.8 ms |
로고 이미지
0 개의 댓글:
댓글 쓰기