2015년 7월 14일 화요일

DB 샘플 데이터를 가지고 Elasticsearch Engine 기능 확인

요약

  • 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.

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)
CPU times: user 531 ms, sys: 132 ms, total: 663 ms
Wall time: 1.38 s
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"))
CPU times: user 3.18 s, sys: 566 ms, total: 3.75 s
Wall time: 3.74 s
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)
CPU times: user 16.5 s, sys: 842 ms, total: 17.3 s
Wall time: 54.8 s
In [5]:
# 샘플 데이터 확인 (추억의 조던 23번으로,)
es.get(index=index_name, doc_type=doc_type_name, id = 23)
Out[5]:
{'_id': '23',
 '_index': 'psql_to_es',
 '_source': {'comment': 152,
  'content': '연일 때아닌 폭염이 기승입니다. 오늘도 불볕더위가 기승을 부리겠는데요. 현재 강원과 전남, 영남 대부분지역으로 폭염주의보지역이 더 확대된 가운데 영월과 대구가 34도까지 오르겠고, 서울도 30도까지 올라서면서 올해들어 가장 덥겠습니다. 당분간 때 이른 여름 더위는 계속되겠는데요, 서울의 경우 이번 주 내내 30도 안팎의 기온을 보이면서 예년 기온을 크게 웃돌겠습니다. ...',
  'ddate': 1432598400000,
  'dtime': 1432616220000,
  'gdate': '20150526',
  'id': 23,
  'link': '-------------',
  'section': '문화',
  'source': 'YTNTV',
  'title': "[날씨] 오늘도 '폭염'...어제보다 더 더워"},
 '_type': 'psql_entity',
 '_version': 2,
 'found': True}

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()
CPU times: user 4 ms, sys: 3 ms, total: 7 ms
Wall time: 10.8 ms
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"])
Hits 136 :
20150502 이데일리: `14년래 최악 경영난` 맥도날드, 회생전략 내놓는다
20150523 TV조선: [뉴스특보] 국내 금융회사들 해외 고가빌딩 매입나서
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()
CPU times: user 12 ms, sys: 2 ms, total: 14 ms
Wall time: 655 ms
In [9]:
# 수집 데이터 확인
print('Hits %d :' % out2.count()[0])
out2.head(2)
Hits 238 :
Out[9]:
gdate source title
0 20150526 연합뉴스 제일모직-삼성물산 합병결의…삼성그룹 재편 가속(종합2보)
1 20150526 아시아경제 제일모직-삼성물산, 9월1일자로 합병…합병사명은 '삼성물산' (상보)

덧 붙임말

  • 결과 건수가 다른 부분은 있지만, 기대만큼의 성능 개선 부분이 확인 된다.
  • 다음 번에는 자연어 처리 - 형태소 분석기를 붙여서, 완성도를 높인 자료를 만들어 보겠다.

비교 (사이즈, 응답시간) 결과 보기


Postgresql Like 검색 Elasticsearch 검색
10,000 데이터 사이즈 35 MB 94 MB
검색 응답 시간 655 ms 10.8 ms

로고 이미지


0 개의 댓글:

댓글 쓰기