⚙️Analyzer 커스터마이징 가이드

이 문서는 Elasticsearch에서 custom analyzer를 설계하고,
nori tokenizer 기반으로 불용어 제거, 품사 필터링, 동의어 처리 등을 적용하는 방법을 다룹니다.


1. ⚙️ analyzer 커스터마이징 개요

✅ custom analyzer란?

custom analyzer = tokenizer + 0개 이상의 filter
  • tokenizer: 입력 텍스트를 토큰으로 분해
  • filters: 토큰을 소문자화, 불용어 제거, 동의어 처리 등 후처리

2. 주요 filter 종류

필터 이름설명
lowercase모든 텍스트를 소문자로 변환
stop불용어(stopword) 제거 (, , 등)
synonym동의어 치환 (예: kakao => 카카오)
nori_part_of_speech품사(POS) 필터링 (예: 접속사 제거)
nori_readingform한자 → 발음으로 변환

3. 예시: nori 기반 커스텀 analyzer

PUT http://localhost:9200/custom-index
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "my_nori_tokenizer": {
          "type": "nori_tokenizer",
          "decompound_mode": "mixed"
        }
      },
      "filter": {
        "my_pos_filter": {
          "type": "nori_part_of_speech",
          "stoptags": [ "E", "IC", "J", "MAG", "MAJ" ]
        },
        "my_stop_filter": {
          "type": "stop",
          "stopwords": [ "의", "가", "이", "은", "는" ]
        },
        "my_synonym_filter": {
          "type": "synonym",
          "synonyms": [
            "카카오, kakao",
            "네이버, naver"
          ]
        }
      },
      "analyzer": {
        "my_korean_analyzer": {
          "type": "custom",
          "tokenizer": "my_nori_tokenizer",
          "filter": [
            "lowercase",
            "my_pos_filter",
            "my_stop_filter",
            "my_synonym_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "my_korean_analyzer"
      }
    }
  }
}

4. 커스텀 analyzer 분석 테스트

POST http://localhost:9200/custom-index/_analyze
{
  "analyzer": "my_korean_analyzer",
  "text": "카카오의 새로운 서비스가 시작되었습니다."
}

📌 예상 결과 (필터 적용됨):

카카오
새롭
서비스
시작
되

✅ 요약 정리

구성 요소설명
tokenizernori 기반으로 형태소 분리
stop filter자주 등장하지만 의미 없는 단어 제거
POS filter조사, 감탄사 등 의미 없는 품사 제외
synonym filter사용자 정의 동의어 등록 가능
lowercase filter대소문자 통일