Elasticsearch analyzer와 search_analyzer 차이

dev-sj·2025년 11월 27일

개요

Elasticsearch에서 텍스트 필드를 다룰 때 두 가지 분석기를 설정할 수 있습니다:

  • analyzer: 인덱싱 시 사용되는 분석기
  • search_analyzer: 검색 시 사용되는 분석기

analyzer (인덱싱 분석기)

역할

문서를 인덱싱할 때 텍스트를 토큰으로 분해하고 처리합니다.

사용 시점

  • 문서가 Elasticsearch에 저장될 때
  • 데이터가 inverted index로 변환될 때

예시

{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "standard"
      }
    }
  }
}

search_analyzer (검색 분석기)

역할

검색 쿼리를 처리할 때 사용되는 분석기입니다.

사용 시점

  • 사용자가 검색 쿼리를 입력할 때
  • 쿼리 텍스트를 토큰으로 분해할 때

예시

{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "standard",
        "search_analyzer": "simple"
      }
    }
  }
}

주요 차이점

구분analyzersearch_analyzer
적용 시점인덱싱(문서 저장) 시검색 쿼리 실행 시
처리 대상문서의 텍스트 데이터검색 쿼리 문자열
기본값standard analyzeranalyzer와 동일
설정 생략 시standard analyzer 사용analyzer 값 사용

언제 다르게 설정하나?

대부분의 경우 동일한 분석기를 사용하지만, 다음과 같은 상황에서 다르게 설정합니다:

1. 동의어 처리

{
  "settings": {
    "analysis": {
      "analyzer": {
        "index_analyzer": {
          "type": "standard"
        },
        "search_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase", "synonym"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "index_analyzer",
        "search_analyzer": "search_analyzer"
      }
    }
  }
}

이유: 인덱싱 시에는 원본 그대로 저장하고, 검색 시에만 동의어를 확장하여 검색 범위를 넓힙니다.

2. n-gram vs standard

{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "ngram_analyzer",
        "search_analyzer": "standard"
      }
    }
  }
}

이유:

  • 인덱싱: n-gram으로 부분 문자열 생성 (자동완성용)
  • 검색: 표준 분석기로 일반 검색 수행

3. Edge n-gram 자동완성

인덱싱 시 edge n-gram을 사용하고 검색 시에는 keyword로 처리하는 경우

실전 예제

한글 검색 최적화

{
  "settings": {
    "analysis": {
      "analyzer": {
        "korean_index": {
          "type": "custom",
          "tokenizer": "nori_tokenizer",
          "filter": ["lowercase"]
        },
        "korean_search": {
          "type": "custom",
          "tokenizer": "nori_tokenizer",
          "filter": ["lowercase", "synonym"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "description": {
        "type": "text",
        "analyzer": "korean_index",
        "search_analyzer": "korean_search"
      }
    }
  }
}

테스트 방법

analyzer 테스트

POST /my_index/_analyze
{
  "analyzer": "standard",
  "text": "테스트 텍스트"
}

search_analyzer 테스트

POST /my_index/_analyze
{
  "field": "content",
  "text": "검색어"
}

베스트 프랙티스

  1. 기본적으로 동일하게 설정: 특별한 이유가 없다면 같은 분석기 사용
  2. 동의어는 검색 시에만: 인덱스 크기 최적화를 위해 search_analyzer에서만 동의어 처리
  3. 테스트 필수: 설정 후 반드시 _analyze API로 결과 확인
  4. 문서화: 다른 분석기를 사용하는 이유를 명확히 문서화

주의사항

  • analyzer와 search_analyzer가 다르면 예상치 못한 검색 결과가 나올 수 있음
  • 분석기가 생성하는 토큰이 호환되어야 올바른 매칭 가능
  • 인덱스 재구성 없이는 analyzer 변경 불가 (reindex 필요)
profile
IT 블로그 채널입니다!!

0개의 댓글