본문 바로가기
글모아

엘라스틱 서치 analyzer와 searchAnalyzer

by 989898 2025. 11. 17.

엘라스틱서치를 제대로 이해하려면 analyzer vs searchAnalyzer 차이를 반드시 알고 있어야 한다.

 
@Field(type = FieldType.Text,
        analyzer = "korean_ngram",
        searchAnalyzer = "korean_ngram")
private String title;
  • analyzer = 인덱싱할 때 사용
  • searchAnalyzer = 검색어를 분석할 때 사용

이렇게 “역할이 다르다”는 걸 이해하는 게 핵심이다.

지금부터 아주 쉽게, 이해폭발하게 설명해줄게.


🔥 1. analyzer — 데이터를 저장할 때(인덱싱) 사용하는 분석기

✔ 데이터가 저장될 때(인덱싱 시)

문서(title, author 등)가 들어오는 순간,
엘라스틱서치는 이 analyzer로 **텍스트를 토큰(조각)**으로 나눠서 인덱스에 저장함.

 
"아지랑이"

analyzer = "korean_ngram" 이면:

  • 아지
  • 지랑
  • 랑이
  • 아지랑
  • 지랑이

이렇게 쪼개져서 인덱스에 저장됨.

즉, analyzer = 인덱스 구조를 결정하는 분석기다.


🔥 2. searchAnalyzer — 검색할 때(검색어 입력) 사용하는 분석기

클라이언트가 검색어를 입력했을 때
엘라스틱서치는 이 분석기를 사용해서 검색어를 토큰화한다.


검색어 → 아지랑이

searchAnalyzer = "korean_ngram" 이면:

  • 아지
  • 지랑
  • 랑이
  • 아지랑
  • 지랑이

똑같이 쪼개진다.

그러니 인덱스에 저장된 토큰과 정확하게 매칭될 수 있음.

즉, searchAnalyzer = 검색어 분석 전용 분석기다.


🔥 analyzer vs searchAnalyzer 왜 나누냐?

이게 아주 중요하다.

1) 인덱싱 할 때는 정밀하고 많은 토큰이 필요할 수 있지만

2) 검색어는 가볍게 처리하고 싶을 수 있음

예를 들어, 자동완성(autocomplete)을 생각해보자.

  • 인덱스에는 "자동완성 기능"을 1~10글자 edge_ngram 형태로 쪼개서 저장해 놓고
  • 검색할 때는 검색어를 그대로 사용 (예: 자)

즉:

상황필요한 분석기
인덱싱 edge_ngram 로 여러 prefix 저장
검색 standard analyzer 로 검색어 그대로 사용

이런 상황처럼, 인덱싱과 검색 사이의 “토큰화 로직”을 분리해야 할 때
analyzer vs searchAnalyzer 를 다르게 설정한다.


🧠 그런데 너는 왜 둘 다 korean_ngram 을 쓰고 있냐?

너의 요구가:

“아지, 지랑, 랑이, 아지랑이 전부 검색돼야 한다”

 

검색어도 똑같이 2~3 글자 단위로 쪼개야만 한다.

 

그래서 인덱싱/검색 둘 다 같은 analyzer를 지정한 것:

 
analyzer = "korean_ngram", searchAnalyzer = "korean_ngram"
 

이 설정을 해야만 네가 원하는 “완전한 부분 문자열 검색”이 성립한다.

 

만약 searchAnalyzer를 바꿔서:

 
searchAnalyzer = "standard"
 

이러면 검색어 "아지랑이"는 한 덩어리로 분석됨 → 인덱스는 조각나 있음 → 매칭이 안 됨.

 

그래서 너 같은 케이스는 analyzer와 searchAnalyzer가 반드시 같아야 한다.


🔥 핵심 요약 (3줄 정리)

  1. analyzer → 데이터 저장할 때 텍스트를 조각내는 규칙
  2. searchAnalyzer → 검색어를 어떻게 조각낼지 결정
  3. 두 분석기가 같은지 다른지는 “검색 전략”에 따라 달라진다