엘라스틱서치를 제대로 이해하려면 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를 지정한 것:
이 설정을 해야만 네가 원하는 “완전한 부분 문자열 검색”이 성립한다.
만약 searchAnalyzer를 바꿔서:
이러면 검색어 "아지랑이"는 한 덩어리로 분석됨 → 인덱스는 조각나 있음 → 매칭이 안 됨.
그래서 너 같은 케이스는 analyzer와 searchAnalyzer가 반드시 같아야 한다.
🔥 핵심 요약 (3줄 정리)
- analyzer → 데이터 저장할 때 텍스트를 조각내는 규칙
- searchAnalyzer → 검색어를 어떻게 조각낼지 결정
- 두 분석기가 같은지 다른지는 “검색 전략”에 따라 달라진다
'글모아' 카테고리의 다른 글
| 포트폴리오 수정 정리 - 커버링 인덱스를 통한 조회 성능 개선 (0) | 2025.11.25 |
|---|---|
| 글모아 프로젝트 개선점 3 (0) | 2025.11.25 |
| 엘라스틱 서치 인덱스 설정 파일 설명 (0) | 2025.11.17 |
| 글모아 프로젝트 개선점 2 (0) | 2025.10.22 |
| 글모아 프로젝트 개선점 1 (1) | 2025.10.14 |