Elastic Search 분석기 - Tokenizer

한민기·2024년 7월 31일

Elastic Search

목록 보기
4/6
post-thumbnail

Tokenizer 란?

텍스트를 분절시키는 방법 입니다.
어떻게 텍스트를 token으로 나눌 것인가?
참고로 tokenizer는 하나만 사용가능하다.

기본 Tokenizer

standard tokenizer는 띄어쓰기를 기준으로 나눈다.

POST _analyze
{
  "analyzer": "standard",
  "text": "안녕하세요 반갑습니다."
}

결과

{
  "tokens": [
    {
      "token": "안녕하세요",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<HANGUL>",
      "position": 0
    },
    {
      "token": "반갑습니다",
      "start_offset": 6,
      "end_offset": 11,
      "type": "<HANGUL>",
      "position": 1
    }
  ]
}

띄어쓰기를 기준으로 나누면 안녕하세요, 안녕을 서로 다른 token으로 저장한다.
Full Text Search 를 더 잘 사용하려면 한글 전용 형태소 분석기를 사용하면 좋다.

nori

먼저 우리나라에서 가장 자주 사용하는 nori를 사용해보겠다.

POST _analyze
{
  "analyzer": "nori",
  "text": "안녕하세요 반갑습니다."
}

결과

{
  "tokens": [
    {
      "token": "안녕",
      "start_offset": 0,
      "end_offset": 2,
      "type": "word",
      "position": 0
    },
    {
      "token": "반갑",
      "start_offset": 6,
      "end_offset": 8,
      "type": "word",
      "position": 4
    }
  ]
}

nori를 사용하면 이렇게 한글에 더 알맞게 나눠준다.

참고로 nori를 사용하기 위해서는 Elasitc server에서 미리 다운 받아야한다.

ngarm

ngram은 문장을 해당 문자갯수에 따라 token으로 나누는 방식이다.

설정

PUT ngram_test_index
{
  "settings": {
    "analysis": {
      "filter": {
        "my_ngram": {
          "type": "ngram",
          "min_gram": 2,
          "max_gram": 3
        }
      }
    }
  }
}
  • min_gram은 최소한으로 나누는 단위, max_gram은 최대한으로 나누는 단위
  • 예시 내용을 보면 2글자, 3글자 단위로 나뉜다.

예시

GET ngram_test_index/_analyze
{
  "tokenizer": "whitespace",
  "filter": [
    "my_ngram"
  ],
  "text": "대한민국"
}

결과

{
  "tokens": [
    {
      "token": "대한",
      "start_offset": 0,
      "end_offset": 4,
      "type": "word",
      "position": 0
    },
    {
      "token": "대한민",
      "start_offset": 0,
      "end_offset": 4,
      "type": "word",
      "position": 0
    },
    {
      "token": "한민",
      "start_offset": 0,
      "end_offset": 4,
      "type": "word",
      "position": 0
    },
    {
      "token": "한민국",
      "start_offset": 0,
      "end_offset": 4,
      "type": "word",
      "position": 0
    },
    {
      "token": "민국",
      "start_offset": 0,
      "end_offset": 4,
      "type": "word",
      "position": 0
    }
  ]
}

ngram 2로 나눴을 때

두개를 같이 사용할 수는 없을까?

검색 퀄리티를 높이기 위해서는 여러가지 방법이 있을 것이다.
nori처럼 분석하는 것도 좋지만 ngram과 같은 방법이 필요할 때도 있을 것이다.
그러면 tokenizer는 한개 밖에 사용 못하는데 어떻게하면 두개의 tokenizer를 사용할 수 있을까?
다음 게시글에서 그 방법을 알려드리고 제가 프로젝트에서 사용했던 방법을 알려드리곘습니다.

profile
백엔드 개발자

0개의 댓글