전체 그래프
Elasticsearch

Analyzer

data-engineeringelasticsearchanalyzertext-analysis

상위: Elasticsearch

요약

Analyzer는 텍스트를 분석하여 검색 가능한 토큰(Token)으로 변환하는 도구입니다. 색인 시점과 검색 시점에 사용됩니다.

구성 요소

  1. Character Filter: 입력 텍스트 전처리 (예: HTML 태그 제거).
  2. Tokenizer: 텍스트를 토큰 단위로 분리 (예: 공백 기준, 형태소 기준). 필수 요소.
  3. Token Filter: 분리된 토큰 가공 (예: 소문자 변환, 불용어 제거, 동의어 처리).

Custom Analyzer

기본 제공 Analyzer 외에, 위 구성 요소들을 조합하여 사용자 정의 Analyzer를 만들 수 있습니다.

  • _analyze API를 통해 테스트 가능합니다.

한국어 분석 (Nori Analyzer)

  • Elasticsearch 공식 한국어 분석기 플러그인.
  • nori_tokenizer: 한국어 형태소 분석.
  • nori_part_of_speech: 품사 필터링.
  • nori_readingform: 한자/외래어를 한글 발음으로 변환.
  • nori_number: 숫자 표준화

Nori Tokenizer 옵션

"tokenizer": {
  "nori_tokenizer": {
    "type": "nori_tokenizer",
    "decompound_mode": "mixed",
    "discard_punctuation": "false",
    "user_dictionary": "dictionary/userdic_ko.txt"
  }
}

_analyze API

커스텀 분석기를 테스트할 수 있는 API입니다.

POST _analyze
{
  "analyzer": "whitespace",
  "text": "삼성 청년 SW 아카데미"
}

Custom Analyzer 조합

여러 요소를 조합하여 custom analyzer를 생성할 수 있습니다.

  • tokenizer는 1개만 사용 가능
  • char_filter, filter는 여러 개 적용 가능
GET _analyze
{
  "char_filter": ["html_strip"],
  "tokenizer": "whitespace",
  "filter": ["stop", "lowercase"],
  "text": "<b>삼성 갤럭시</b> S25 Ultra"
}

동의어 처리

색인 시 동의어 처리

  • 문서가 색인될 때 동의어 확장 저장
  • 단점: 색인 크기 증가, 새 동의어 추가 시 재색인 필요

검색 시 동의어 처리

  • 쿼리 시점에 동의어 확장
  • 단점: 성능 저하 가능, 오탐 위험

동의어 구성 방식

// 동등 관계 (A, B): A 입력 시 B도 매칭
"synonyms": ["notebook, laptop"]

// 치환 관계 (A → B): A가 B로 치환
"synonyms": ["notebook => laptop"]

불용어 (Stopword) 처리

config/dictionary/stopwords.txt 파일에 한 줄당 하나의 단어로 저장합니다.

PUT /products
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "search_stop_analyzer": {
            "tokenizer": "whitespace",
            "filter": ["search_stop_filter"]
          }
        },
        "filter": {
          "search_stop_filter": {
            "type": "stop",
            "stopwords_path": "dictionary/stopwords.txt"
          }
        }
      }
    }
  }
}