개요

최근 ES 버전이 급변하게 업데이트 되고 있습니다. 심지어 6버전도 준비하고 있죠.

또한 ES는 플러그인 버전이 ES 버전과 맞아야 되는 컨벤션을 가져가는데 이에 따라 ES 업그레이드를 할때 한국 사용자들은 은전한닢 버전을 신경써야 하는 이슈가 있습니다.

이에 따라 기존에 정리해둔 은전한닢 설치 블로그 포스팅을 업데이트 하며 최근 5버전 대에서는 통용 가능한 버전별 플러그인을 만드는 Trick에 대해 포스팅 하고자 합니다.

편의상 아래부터 존칭은 생략합니다.

버전별 은전한닢 ES 플러그인

현재까지 은전한닢 BitBucket에 올라온 미리 만들어둔 원하는 버전의 플러그인은 아래에서 다운받으면 된다.

원하는 버전의 은전한닢 플러그인 만들기

아래 Trick은 필자가 테스트해본 바로는 상용으로 사용하여도 문제가 없었다. 하지만 어디까지나 경험적인 방법이기 때문에 주의가 필요하다.

필자가 5버전대 은전한닢 소스코드를 보고 5.2.0용 플러그인을 재빌드 하며 보았을 때 최근에는 인터페이스나 내부 구현의 변화가 없는것으로 파악했다. 따라서 ES버전 – 플러그인 버전간 버전체크만 맞추어 주면 은전한닢 플러그인이 정상동작하는것을 알 수 있었다.

이점을 이용하여 기존 5.x대 플러그인에서 버전체크를 위한 정보만 바꾸어 주면 플러그인이 정상동작한다. 이 방법을 이용하여 지난주에 나온 5.5.0용 플러그인을 만들어보자.

기존 5.4.0용 플러그인을 다운로드 하여 압축을 풀면 elasticsearch 디렉토리가 나온다.

$ wget https://bitbucket.org/eunjeon/mecab-ko-lucene-analyzer/issues/attachments/7/eunjeon/mecab-ko-lucene-analyzer/1494226708.77/7/elasticsearch-analysis-mecab-ko-5.4.0.0.zip
$ unzip elasticsearch-analysis-mecab-ko-5.4.0.0.zip
$ ls
elasticsearch  elasticsearch-analysis-mecab-ko-5.4.0.0.zip
$ cd elasticsearch

이 디렉토리 안에 들어가서 아래의 그림에서표시한 2개의 파일만 수정해 주면된다.

jar 파일의 경우 파일명에 붙어있는 버전 정보를 바꾸어 준다.

plugin-descriptor.properties 파일은 열어 버전을 변경해준다.

# 'version': plugin's version
version=5.5.0.0
elasticsearch.version=5.5.0

이 폴더를 다시 압축하여 elasticsearch-analysis-mecab-ko-5.5.0.0.zip를 압축하면 끝이다.

lks21c@lks21cubuntu:mecab ()$ ls
elasticsearch
elasticsearch-analysis-mecab-ko-5.4.0.0.zip
elasticsearch-analysis-mecab-ko-5.5.0.0.zip

방금 만들어진 플러그인을 설치해 보면 정상설치가 됨을 확인 할 수 있다.

설치방법

아래부터는 은전 한닢의 설치에 대한 정리이다. 5.2.0 기준 포스팅이지만 최근(5.5.0)까지 동작하는데 문제가 없는것을 확인하였다.

ES 5.2.0 다운로드

ES 5.2.0을 다운로드 받아서 압축을 푼다.

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.0.tar.gz
$ tar xzvf elasticsearch-5.2.0.tar.gz
$ cd elasticsearch-5.2.0

mecab-ko 라이브러리 설치

  • https://bitbucket.org/eunjeon/mecab-ko/downloads에서 최신 버전 다운로드
  • 현재 기준 5.2.0과 mecab-0.996-ko-0.9.2.tar.gz 호환 문제 없음

    $ sudo apt-get install g++ #의외로 이걸로 에러가 발생 할 수 있음
    $ wget http://www.kwangsiklee.com/wp-content/uploads/2017/02/mecab-0.996-ko-0.9.2.tar-1.gz
    $ tar -xvzf mecab-XX-ko-XX.tar.gz
    $ cd mecab-XX-ko-XX
    $ ./configure
    $ make
    $ make check
    $ sudo make install
    $ sudo ldconfig # 라이브러리는 기본적으로 /usr/local/lib/ 에 설치 된다.
    

mecab-ko-dic 사전 설치

  • https://bitbucket.org/eunjeon/mecab-ko-dic/downloads 에서 최신버전 다운로드
  • 현재 기준 5.2.0과 mecab-ko-dic-2.0.1-20150920.tar.gz 호환 문제 없음

    $ wget http://www.kwangsiklee.com/wp-content/uploads/2017/02/mecab-ko-dic-2.0.1-20150920.tar.gz
    $ tar -xvzf mecab-ko-dic-XX.tar.gz $ cd mecab-ko-dic-XX
    $ ./configure
    $ make
    $ sudo make install # 사전은 기본적으로 /usr/local/lib/mecab/dic/mecab-ko-dic에 설치 된다.
    

analysis-mecab-ko 플러그인 설치

ES 5.2.0용 analysis-mecab-ko 플러그인이 아직 은전한닢 페이지에서 개발이 되어 있지 않은 관계로 직접 소스코드로 5.2.0 플러그인을 빌드하였다.

$ ./bin/elasticsearch-plugin install https://bitbucket.org/eunjeon/mecab-ko-lucene-analyzer/issues/attachments/7/eunjeon/mecab-ko-lucene-analyzer/1486603969.8/7/elasticsearch-analysis-mecab-ko-5.2.0.0.zip
$ # 경고 메세지는 y로 넘어가면 된다.

설치시 아래와 같이 진행 된다.

mecab-java 다시 컴파일

make 전에 링크 참고하여 컴파일 옵션 바꾸기

$ wget https://bitbucket.org/eunjeon/mecab-java/downloads/mecab-java-0.996.tar.gz
$ tar zxvf mecab-java-0.996.tar.gz
$ cd mecab-java-0.996
$ vi Makefile

Makefile에서 바꿀 부분은 2가지 이다.

(CXX) -O3 -c -fpic $(TARGET)_wrap.cxx $(INC) 라인을 $(CXX) -O1 -c -fpic $(TARGET)_wrap.cxx $(INC) 으로 바꾼다.

INCLUDE 부분을 INCLUDE=/usr/lib/jvm/java-8-oracle/include 이런식으로 본인에 맞게 변경한다.

$ make
$ sudo cp libMeCab.so /usr/local/lib

환경변수 설정

export ES_JAVA_OPTS="${ES_JAVA_OPTS} -Djava.library.path=/usr/local/lib"

검증

ES를 띄우고 아래의 쉘 스크립트로 한글 형태소 분석이 정상 동작하는지 확인해본다.

#!/usr/bin/env bash

ES='http://localhost:9200'
ESIDX='seunjeon-idx'

echo "put setting"
curl -XPUT "${ES}/${ESIDX}/?pretty" -d '{
  "settings" : {
    "index":{
      "analysis":{
        "analyzer":{
          "korean":{
            "type":"custom",
            "tokenizer":"seunjeon_default_tokenizer"
          }
        },
        "tokenizer": {
          "seunjeon_default_tokenizer": {
            "type": "mecab_ko_standard_tokenizer",
            "mecab_args": "/usr/local/lib/mecab/dic/mecab-ko-dic"
          }
        }
      }
    }
  }
}'

sleep 1

echo "========================================================================"
curl -XGET "${ES}/${ESIDX}/_analyze?analyzer=korean&pretty" -d '삼성전자'
echo "========================================================================"
curl -XGET "${ES}/${ESIDX}/_analyze?analyzer=korean&pretty" -d '빨라짐'
echo "========================================================================"
curl -XGET "${ES}/${ESIDX}/_analyze?analyzer=korean&pretty" -d '낄끼빠빠 어그로'
echo "========================================================================"
curl -XGET "${ES}/${ESIDX}/_analyze?analyzer=korean&pretty" -d '미노야 오늘 밤에 밥 한번 만들어줘라 바비동생이 너무 빠르게 밥먹다 체했다 미노가 빠르던 느리던 꼭꼭 씹어서 먹는법 좀 알려줘라'

echo "delete index"
curl -XDELETE "${ES}/${ESIDX}?pretty"

쉘 실행 시 아래와 같이 한글 토큰이 분절되면 성공이다.