티스토리 뷰

AWS

elasticsearch nori 플러그인이 뭐예요?

나를찾는아이 2022. 2. 28. 13:55
728x90
반응형

elasticsearch에서 한글검색을 잘 사용하기 위해 한글 플러그인을 설치해봅시다

 

https://www.elastic.co/kr/blog/nori-the-official-elasticsearch-plugin-for-korean-language-analysis

 

Nori: The Official Elasticsearch Plugin for Korean Language Analysis

얼마 전에 “어떤 한국어 분석기를 사용할까”라는 블로그 포스트를 발표한 적이 있습니다. 이 기사는 Elasticsearch 클러스터에 설치해서 한국어 지원을 강화할 수 있는 세 가지 서드파티 플러그

www.elastic.co

노리를 공식 플러그인으로 지원하고 있습니다

 

 

 

지난 포스팅에서의 elasticsearch설치를 무사히 마치셨나요?

 

https://trend21c.tistory.com/2219

 

elasticsearch 손쉽게 설치하기

elasticsearch는 맥에서 homebrew가 있으면 설치가 매우 쉽습니다 아래의 명령어를 순차적으로 입력해주세요 brew tap elastic/tap brew install elasticsearch-full 설치가 완료되었습니다 실행도 간단합니다 ela..

trend21c.tistory.com

 

그렇다면 아래의 명령어를 입력하여 노리 플러그인 설치를 완료합니다

 

설치가 매우 쉽습니다

 

elasticsearch-plugin install analysis-nori

 

 

그리고 elasticsearch를 재실행해주세요

 

 

일단 설치는 하긴 했는데 노리 플러그인은 도대체 무슨일을 하는걸까요?

 

우리가 설치한 플러그인이 nori analyzer라고 하는거거든요

 

일단 elasticsearch에서 말하는 analyzer가 뭔지 알아볼께요

 

 

analyzer는 

 

0개 또는 그 이상의 캐릭터필터(Character filter)

1개의 토크나이저(tokenizer)

0개 또는 그 이상의 토큰필터(token filter)

 

이렇게 구성이 되어있어요

 

 

캐릭터 필터는 입력받은 텍스트를 가공하는 필터인데

 

예를 들면 입력받은 텍스트에서 html 태그를 삭제한다던가 글자를 치환한다던가 토큰화 하기 이전의 텍스트 변환을 수행하고

 

 

토크나이저는

 

입력받은 텍스트를 검색을 위한 형태로 토큰화 합니다(독립적인 단어들로 쪼갠다고 보시면 됩니다)

 

 

그리고 토큰필터는

 

토큰화된 단어들에서 필요없는것은 빼고, 특정 단어를 변환시키고 이런것들을 한답니다

 

예를 들면 lowercase라는 토큰필터는 토큰화된 단어를 소문자화 시킨답니다

 

 

그럼 다시 노리 analyzer를 살펴볼게요

 

https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-nori-analyzer.html

 

nori analyzer | Elasticsearch Plugins and Integrations [8.0] | Elastic

 

www.elastic.co

 

노리플러그인에 대해서 자세한 설명이 나와있는페이지 입니다

 

nori analyzer는 다음과 같은 구성으로 이루어져있습니다

 

  • nori_tokenizer
  • nori_part_of_speech 토큰 필터
  • nori_readingform 토큰필터
  • lowercase 토큰 필터

 

그러니깐 1개의 토크나이저와 3개의 토큰필터로 구성된것이 nori analyzer입니다

 

 

 

 

nori 토크나이저가 어떻게 동작하는지 살펴볼까요?

 

"아버지가 방에 들어가신다" 라는 문장이 nori 토크나이저를 통하면 어떻게 분석되는지 테스트해봅시다

 

_analyze API를 통해 직접 토크나이저를 지정해서 어떤 결과가 나오는지 볼거예요

 

 

기본토큰(standard)

 

 

POST http://localhost:9200/_analyze

 

body

{
  "tokenizer": "standard",
  "text": [
    "아버지가 방에 들어가신다"
  ]
}

 

 

response

{
    "tokens": [
        {
            "token": "아버지가",
            "start_offset": 0,
            "end_offset": 4,
            "type": "<HANGUL>",
            "position": 0
        },
        {
            "token": "방에",
            "start_offset": 5,
            "end_offset": 7,
            "type": "<HANGUL>",
            "position": 1
        },
        {
            "token": "들어가신다",
            "start_offset": 8,
            "end_offset": 13,
            "type": "<HANGUL>",
            "position": 2
        }
    ]
}

 

단순하게 띄어쓰기 단위로 텍스트가 토큰화되었습니다

 

이문장에서 검색을 위한 단어는 "아버지" 또는 "방"이어야 하는데 정확히 이 단어를 인지하지 못했네요

 

이런상황에서는 "아버지"로 검색이 되지 않고, "아버지가" 라고 검색해야 원하는 결과를 받을수 있게될거예요

 

 

노리 토크나이저

 

body

{
  "tokenizer": "nori_tokenizer",
  "text": [
    "아버지가 방에 들어가신다"
  ]
}

 

response

{
    "tokens": [
        {
            "token": "아버지",
            "start_offset": 0,
            "end_offset": 3,
            "type": "word",
            "position": 0
        },
        {
            "token": "가",
            "start_offset": 3,
            "end_offset": 4,
            "type": "word",
            "position": 1
        },
        {
            "token": "방",
            "start_offset": 5,
            "end_offset": 6,
            "type": "word",
            "position": 2
        },
        {
            "token": "에",
            "start_offset": 6,
            "end_offset": 7,
            "type": "word",
            "position": 3
        },
        {
            "token": "들어가",
            "start_offset": 8,
            "end_offset": 11,
            "type": "word",
            "position": 4
        },
        {
            "token": "시",
            "start_offset": 11,
            "end_offset": 13,
            "type": "word",
            "position": 5
        },
        {
            "token": "ㄴ다",
            "start_offset": 11,
            "end_offset": 13,
            "type": "word",
            "position": 6
        }
    ]
}

 

 

좀 더 풍부하게 토큰화 되었습니다

 

"아버지" 단어도 인식했고, "방"도 인식하는군요

 

 

노리 플러그인이 한글을 좀 더 정확하게 "토큰화"해주는것을 볼 수 있습니다

 

 

 

단어를 토큰화하여 색인되어야 elasticsearch를 통해 원하는 단어로 검색이 가능한건데

 

이렇듯 정확한 한글검색을 위해서는 한글 토크나이저가 필요합니다

 

 

nori analyzer는 

 

nori tokenizer를 통해 토큰화를 완료하고

 

그리고 3개의 토큰 필터를 동작시킵니다

 

nori_part_of_speech 토큰 필터 - 에, 가 이러한 검색에 필요없는 단어들을 제거합니다
nori_readingform 토큰필터 - 한자가 있는 경우 한자를 한글로 저장합니다(鄕歌 -> 향가)
lowercase 토큰 필터 - 영단어가 있는 경우 영어 단어 대문자를 소문자화합니다

 

 

이렇게 nori analyzer를 통해서

 

"아버지가 방에 들어가신다"

 

라는 문장은 "아버지", "방"이라는 단어로 역색인화 되었고,

 

"아버지" 또는 "방"을 검색했을때 이 문장을 찾을수 있게 되는것이예요

 

 

 

 

 

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함