Date

도전

  • GS SHOP의 방송편성표를 보여주는 웹 페이지를 작성
  • 관련 기술 Elasticsearch 플러그인, 형태소 분석기, Thrift 서버, HAProxy
  • 형태소 분석이 필요한 이유?
    한국어 분석을 지원하지 않는다. 예를 들어 "아버지가 방에 들어간다"라는 한국어 문장을 인덱스해도 "아버지"로는 검색이 안 되고, 반드시 "아버지가"로 검색해야만 결과에 출력된다.
  • 형태소 분석기 - 은전 한 잎(mecab-ko)

설치

외부에서 접근 가능한 환경을 구현하기 위해서 AWS를 이용하기로 했다.

Amazon Elasticsearch Service

search-buzzni-xusbuesxyq6c33zkupvvvmjof4.ap-northeast-2.es.amazonaws.com'

``` python 연결확인 from datetime import datetime from elasticsearch import Elasticsearch host = 'search-buzzni-xusbuesxyq6c33zkupvvvmjof4.ap-northeast-2.es.amazonaws.com' es = Elasticsearch([{'host': host,'port':80}]) print es.cluster.health()['status']

es.indices.create(index='my-index', ignore=400) es.index(index="my-index", doc_type="test-type", id=42, body={"any": "data", "timestamp": datetime.now()})

es.get(index="my-index", doc_type="test-type", id=42)['_source']

### 해야 할 일 ###
  * 크롤링
    * `http://www.gsshop.com`  아이템의 세부 페이지 구하기
    * 세부 페이지에 방문해 제품에 대한 구체적인 정보 얻기
``` python 추후에 celery task에서 크롤링할  사용될 코드
# -*- coding: utf-8 -*-
import requests
from lxml import etree

home_url = 'http://www.gsshop.com'

def get_product(prod_url):
    url = "%s%s" % (home_url, prod_url)

    if 'http' in prod_url:
        url = prod_url
        return

    print url
    ele_response = requests.get(url)
    tree = etree.HTML(ele_response.content)
    price = tree.xpath("//span[contains(@class,'price-definition-ins')]/ins/strong")[0].text
    title = tree.xpath("//p[contains(@class,'product-title')]/text()")[0]
    # DOTO : 그외에 정보 추후 고려


def get_list_of_product():
    list_url = "%s%s" % (home_url, '/tv/tvScheduleMain.gs')
    response = requests.get(list_url)

    prod_urls = []
    tree = etree.HTML(response.content)
    for ele in tree.xpath("//tr/td/div[contains(@class, 'tdWrap')]/a"):
        if len(ele.text.strip()):
            prod_url = ele.xpath('@href')[0]
            prod_urls.append(prod_url)

    for url in prod_urls:
        print get_product(url)
  • 데이타 인덱스 - 위에서 얻어진 정보를 ES에 인덱싱하여 저장
  • 형태소 분석 - ES에서 한글은 지원하지 않는다고 하므로 별도의 형태소 분석기 필요
  • 주기적으로 GS SHOP 페이지 정보 얻어오기(Celery)

형태서 분석기 설치

AWS에서 제공하는 Elasticsearch에 직접 한글 형태소 분석기를 직접 설치 할 수 있는 방법은 찾지 못했다. 따라서 별도의 EC2 인스턴스를 만들어 그 인스턴스와 Elasticsearch가 통신할 수 있으면 같은 효과를 얻을 수 있다고 생각하였다.

  • MECAB-KO 형태소 분석기 엔진
cd /tmp/
wget https://bitbucket.org/eunjeon/mecab-ko/downloads/mecab-0.996-ko-0.9.2.tar.gz
tar -xvzf mecab-0.996-ko-0.9.2.tar.gz
cd mecab-0.996-ko-0.9.2
./configure
make
make check
sudo make install
  • MECAB-KO-DIC 사전(DICTIONARY) 파일
cd /tmp/
wget https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-1.6.1-20140814.tar.gz
tar -xvzf ./mecab-ko-dic-1.6.1-20140814.tar.gz
cd mecab-ko-dic-1.6.1-20140814
./autogen.sh
./configure
make
sudo make install
/usr/local/libexec/mecab/mecab-dict-index: error while loading shared libraries: libmecab.so.2: cannot open shared object file: no such file or directory
sudo ldconfig
grep /usr/local/lib
configure: error: Your compiler is not powerful enough to compile MeCab.
sudo yum install gcc-c++
  • MECAB-KO 형태소 분석기와 MECAB-KO-DIC 사전파일 확인
mecab -d /usr/local/lib/mecab/dic/mecab-ko-dic
  • LIBMECAB.SO, MECAB.JAR 설치
cd /tmp/
wget https://bitbucket.org/eunjeon/mecab-java/downloads/mecab-java-0.996.tar.gz
tar -xvzf mecab-java-0.996.tar.gz
cd mecab-java-0.996
vi Makefile
sudo cp libMeCab.so /usr/local/lib
sudo cp MeCab.jar /usr/local/lib

sudo chown -R $(whoami):$(whoami) /usr/local/lib/libMeCab.so
sudo chown -R $(whoami):$(whoami) /usr/local/lib/MeCab.jar
sudo chown -R $(whoami):$(whoami) /usr/local/lib/*mecab*

export JAVA_HOME=/usr/java/jdk1.8.0_60/

sudo ln -s $JAVA_HOME/include/linux/jni_md.h $JAVA_HOME/include/jni_md.h
sudo ln -s $JAVA_HOME/include/linux/jawt_md.h $JAVA_HOME/include/jawt_md.h

cd /tmp
wget https://bitbucket.org/eunjeon/mecab-ko-lucene-analyzer/downloads/elasticsearch-analysis-mecab-ko-0.16.1.zip

export ES=/usr/share/elasticsearch/

$ES/bin/plugin --install analysis-mecab-ko-0.16.1 --url file:///tmp/elasticsearch-analysis-mecab-ko-0.16.1.zip

결론

  • 한글 형태의 text를 ES에 인덱싱하여 텍스트 풀서치를 하는 아주 일반적인 환경을 구축하는 요구사항이었다.
  • 외부에서 접근 가능한 형태를 위해 AWS ES를 선택했는데, 한글 형태소 분석을 위해서 별도의 모듈을 설치해야만 했다.
  • 다행히 Python에서 ES를 제어하기 위한 활성화된 패키지(https://github.com/elastic/elasticsearch-py)가 있어 기능 구현을 위해서 큰 어려움이 없을 것 같았다. 하지만 그러한 환경 구축에 경험이 없어서 대부분의 시간을 설치를 하는데 소비하였다.
  • 결국은 요구한 미션을 마무리하지 못했다. 그 이유는
    • ES에서 plugin을 어떤식으로 제어하고 활용하는 방법에 대한 이해 부족
    • 전반적인 패키지 구성에 대한 경험이 없어 많은 시간을 소비
    • 형태소 분석기 설치 문서가 있지만, 조금 시간이 지나서 그런지 지금 버전과 맞지 않아 설치에 애를 먹음
  • 배움
    • AWS ES 설치는 생각보다 어렵지 않았다.
    • 은전한잎(mecab-ko)의 도움으로 형태소 분석이 가능하며, ES를 활용할 수 있다.

참고

  • elasticsearch로 로그 검색 시스템 만들기 http://d2.naver.com/helloworld/273788
  • ELASTICSEARCH 한글 형태소 분석기(ANALYZER) 비교 http://guruble.com/?p=437
  • 엘라스틱서치(elasticsearch)에 한글 형태소 분석기 은전한잎(eunjeon) 적용하기 - http://blog.nacyot.com/articles/2015-06-13-eunjeon-with-elasticsearch/
관계형 데이터베이스 elasticsearch
Database Index
Table Type
Row Document
Column Field
Schema Mapping
Index Everything is indexed
SQL Query DSL