Elasticsearch 한글 형태소 설치 및 사용
데이터베이스/Elasticsearch

Elasticsearch 한글 형태소 설치 및 사용

반응형

Elasticsearch 검색시에 한글 형태소를 사용하지 않으면 term을 단순하게 공백을 이용해서 쪼갠다. 하지만 한글말에는 조사도 구분해야하고 품사도 구분해서 사용해야 정확한 검색을 지원할 수 있다.

한글 형태소 플러그인은 크게 arirang, seunjeon, open korea text가 존재한다. 3개의 성능 비교와 자세한 설명은 엘라스틱 서치 블로그에서 참고하면 된다.

https://www.elastic.co/kr/blog/using-korean-analyzers


open korea text 설치

3가지 플러그인중에 open korea text를 사용해서 기능을 테스트해보자.

우선 docker를 사용중이므로 elasticsearch 내부 bash shell로 접속한 후 elasticsearch-plugin 명령어를 사용하여 설치해보자. 설치 파일은 github 페이지를 참고하면 된다. https://github.com/open-korean-text/elasticsearch-analysis-openkoreantext 

1
2
3
4
5
#bash shell 접속
docker exec -it elastic /bin/bash
 
#설치
bin/elasticsearch-plugin install https://github.com/open-korean-text/elasticsearch-analysis-openkoreantext/releases/download/6.1.1/elasticsearch-analysis-openkoreantext-6.1.1.2-plugin.zip
cs


설치한 후 docker를 재시작 한다. 엘라스틱서치가 실행되면서 로그를 살펴보면 open korea text 모듈이 load 되는 것을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[2018-09-13T13:41:28,292][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded module [aggs-matrix-stats]
[2018-09-13T13:41:28,292][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded module [analysis-common]
[2018-09-13T13:41:28,292][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded module [ingest-common]
[2018-09-13T13:41:28,292][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded module [lang-expression]
[2018-09-13T13:41:28,292][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded module [lang-mustache]
[2018-09-13T13:41:28,292][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded module [lang-painless]
[2018-09-13T13:41:28,293][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded module [mapper-extras]
[2018-09-13T13:41:28,293][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded module [parent-join]
[2018-09-13T13:41:28,293][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded module [percolator]
[2018-09-13T13:41:28,293][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded module [reindex]
[2018-09-13T13:41:28,293][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded module [repository-url]
[2018-09-13T13:41:28,293][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded module [transport-netty4]
[2018-09-13T13:41:28,293][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded module [tribe]
[2018-09-13T13:41:28,294][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded plugin [analysis-seunjeon]
[2018-09-13T13:41:28,294][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded plugin [elasticsearch-analysis-openkoreantext]
[2018-09-13T13:41:28,294][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded plugin [ingest-geoip]
[2018-09-13T13:41:28,294][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded plugin [ingest-user-agent]
[2018-09-13T13:41:28,294][INFO ][o.e.p.PluginsService     ] [c-CqQL8] loaded plugin [x-pack]
cs


인덱스 생성
간단하게 title만 가지고 있는 인덱스를 생성해보자. 생성할 때 analyzer를 설치한 open korea text를 지정해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
PUT cgv      // 인덱스
{
  "mappings" : {
    "movie" : {   // 타입
      "properties": {
        "title" : { 
          "type" : "text",
          "analyzer": "openkoreantext-analyzer"  // 형태소
        }
      }
    }
  }
}
cs


데이터 삽입

1
2
3
4
5
6
7
8
9
POST cgv/movie/
{
 "title" : "여전히 돈 많은 백수가 되고싶다展"
}
 
POST cgv/movie/
{
 "title" : "뮤지컬 〈점프 (JUMP)〉- 서울전용극장(명보아트홀3F)"
}
cs


조회
비슷한 문자열을 가진 검색어를 통해서 검색을 해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#검색1
GET cgv/movie/_search
{
  "query": {
    "match": {
      "title": "뮤지컬 점프(JUMP)"
    }
  }
}
 
#결과1
{
  "took": 23,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.8630463,
    "hits": [
      {
        "_index": "cgv",
        "_type": "movie",
        "_id": "_update",
        "_score": 0.8630463,
        "_source": {
          "title": "뮤지컬 〈점프 (JUMP)〉- 서울전용극장(명보아트홀3F)"
        }
      }
    ]
  }
}
 
#검색2
GET cgv/movie/_search
{
  "query": {
    "match": {
      "title": "1인권/입장권]여전히 돈 많은 백수가 되고싶다展"
    }
  }
}
 
#결과2
{
  "took": 9,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 4.8969383,
    "hits": [
      {
        "_index": "cgv",
        "_type": "movie",
        "_id": "_update",
        "_score": 4.8969383,
        "_source": {
          "title": "여전히 돈 많은 백수가 되고싶다展"
        }
      }
    ]
  }
}
cs


잘된다. 형태소 분석기 만드시는분들 보면 개인적으로 만드시는데 대단하신분들 인거 같다.



반응형