ElasticSearch Nori 형태소 분석기 사용해보기

윤들윤들·2021년 2월 28일
2
post-thumbnail

토이 프로젝트를 진행하면서 ElasticSearch에 대해 공부를 시작했습니다.

토이 프로젝트를 진행하면서 검색엔진에 대한 필요성을 느꼈고 형태소 분석을 통한 검색을 하깅 위해 nori라는 플러그인을 사용해야한다고 하여 이렇게 포스팅을 남기게 되었습니다.

저는 elasticsearch-7.9.1 을사용하였으며 window에서 진행하였습니다.

먼저 다음과 같이 명령어를 입력하여 analysis-nori 플러그인을 설치합니다

# elasticsearch 설치경로의 bin 에서 진행합니다  .
$ bin/elasticsearch-plugin install analysis-nori

설치가 완료되었다면 실행중인 ElasticSearch 서비스를 재시작 해줍니다.
여기까지 되었다면 nori 형태소 분석기 플러그인의 설치는 끝났습니다.

그렇다면 Standard Tokenizer와 Nori Tokenizer가 어떠한 차이가 있는지 tokenizer를 실행하여 테스트 해보겠습니다.

###################### Nori Tokenizer 테스트 #################################

GET _analyze
{
  "tokenizer": "standard",
  "text" : [
      "개발자 최윤진 입니다"
    ]
}

# 실행 결과
{
  "tokens" : [
    {
      "token" : "개발자",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "<HANGUL>",
      "position" : 0
    },
    {
      "token" : "최윤진",
      "start_offset" : 4,
      "end_offset" : 7,
      "type" : "<HANGUL>",
      "position" : 1
    },
    {
      "token" : "입니다",
      "start_offset" : 8,
      "end_offset" : 11,
      "type" : "<HANGUL>",
      "position" : 2
    }
  ]
}



GET _analyze
{
  "tokenizer": "nori_tokenizer",
  "text" : [
      "개발자 최윤진 입니다"
    ]
}
# 실행 결과 
{
  "tokens" : [
    {
      "token" : "개발",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "자",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "최윤진",
      "start_offset" : 4,
      "end_offset" : 7,
      "type" : "word",
      "position" : 2
    },
    {
      "token" : "이",
      "start_offset" : 8,
      "end_offset" : 11,
      "type" : "word",
      "position" : 3
    },
    {
      "token" : "ᄇ니다",
      "start_offset" : 8,
      "end_offset" : 11,
      "type" : "word",
      "position" : 4
    }
  ]
}

Standard Tokenizer같은 경우는 공백 외에는 아무런 단어에 대해 분리하지 못하였지만 nori_tokenizer는 한국어 사전 정보를 이용해 , , 개발 과 같은 단어들을 분리한 것을 확인할 수 있습니다.


💡 Board 인덱스 추가후 nori-analyzer 테스트 해보기

간단하게 title만 넣어서 테스트해보겠습니다

PUT /board
{
  "settings": {
    "analysis": {
      "analyzer": {
        "nori" : {
          "tokenizer" : "nori_tokenizer"
        }
      }
    }
  },

  "mappings": {
    "properties": {
      "boardKey" : {
        "type": "keyword"
      },
      
      "title" : {
        "type": "text",
        "analyzer": "nori"
      }
    }
  }
}

다음과 같이 nori 라는 이름으로 nori_tokenizer를 설정한후 title 필드에 analyzer:"nori" 설정을하고 인덱스를 생성합니다.

# Test Data

POST /board/_doc/1 
{
  "boardKey" : "board_w30fi31weasd",
  "title" : "엘라스틱서치 너무 재미있어요."
}

Text데이터는 다음과 같이 엘라스틱 서치 너무 재미있어요. 라고 넣어주겠습니다.

# standard analyzer
GET _analyze
{
  "tokenizer": "standard",
  "text" : [
      "엘라스틱서치 너무 재미있어요."
    ]
}

# 검색 결과
[
    {
      "token" : "엘라스틱서치",
      "start_offset" : 0,
      "end_offset" : 6,
      "type" : "<HANGUL>",
      "position" : 0
    },
    {
      "token" : "너무",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "<HANGUL>",
      "position" : 1
    },
    {
      "token" : "재미있어요",
      "start_offset" : 10,
      "end_offset" : 15,
      "type" : "<HANGUL>",
      "position" : 2
    }
  ]

# nori analyzer
GET _analyze
{
  "tokenizer": "nori_tokenizer",
  "text" : [
      "엘라스틱서치 너무 재미있어요."
    ]
}

# 검색 결과
[
    {
      "token" : "엘라스틱",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "서치",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "너무",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "word",
      "position" : 2
    },
    {
      "token" : "재밌",
      "start_offset" : 10,
      "end_offset" : 13,
      "type" : "word",
      "position" : 3
    },
    {
      "token" : "어요",
      "start_offset" : 13,
      "end_offset" : 15,
      "type" : "word",
      "position" : 4
    }
  ]

일반 형태소분석기와 다른 결과를 얻은것을 볼수 있습니다.

지금당장 어떠한 예를 들어 설명할수는 없지만 앞으로 진행할 토이프로젝트에서 검색쪽에 적절하게 사용할 수 있을듯 합니다.

엘라스틱서치를 좀더 공부해봐야 할것 같습니다.

한글 형태소 분석 잘해보기
노리 한글형태소 분석 설치 가이드

profile
Front&BaackEnd를 재미있게 공부하고싶은 개발자 YundleYundle

0개의 댓글