← 학습 카테고리

Learn

Elasticsearch

50개 모듈 · 현재 3번째

Elasticsearch 모듈 3/50 elasticsearch-learn-03

매핑과 분석기 — 필드 타입, 토크나이저·필터 파이프라인

Elasticsearch 공식 문서(elastic.co/docs) 및 기술 블로그 종합 — 아키텍처부터 운영까지 (웹 리서치, 2026) — Elastic 공식 문서 + 여러 기술 블로그(Opster, Baeldung 등) 교차 확인

이 모듈을 다 읽으면

  • 매핑이 무엇을 정의하고 왜 미리 설계하는 게 중요한지 설명할 수 있다
  • analyzer가 tokenizer + filter의 파이프라인이라는 것과 이게 검색 결과에 미치는 영향을 판단할 수 있다
  • text와 keyword 필드 타입의 근본적인 차이를 구분할 수 있다

필드 타입/analyzer 파이프라인을 정의하는 매핑 개념과, text vs keyword의 실무적 차이를 정리한다.

매핑 — 필드마다 어떻게 저장·색인할지 정의

매핑은 인덱스의 각 필드가 어떤 타입(text, keyword, integer, date 등)인지, 어떤 analyzer를 거칠지, 검색 가능한지 등을 정의한다. 매핑을 명시하지 않으면 동적 매핑(dynamic mapping)이 첫 문서를 보고 타입을 추측해 자동 생성하는데, 이는 편리하지만 위험하다 — 문자열 필드가 들어오면 기본적으로 text와 keyword 두 가지로 동시에 색인되어 저장 공간이 늘고, 다양한 필드명을 가진 JSON을 무분별하게 색인하면 필드 개수가 계속 늘어나는 '매핑 폭발(mapping explosion)' 문제로 이어질 수 있다(인덱스당 필드 수 기본 상한 1000개).

핵심 포인트

  • 매핑 = 필드별 타입·analyzer·색인 여부 정의. 동적 매핑은 편리하지만 매핑 폭발 위험이 있다
  • 문자열 필드는 동적 매핑 시 기본적으로 text+keyword 이중으로 색인된다

Analyzer = Tokenizer + Filter 파이프라인

analyzer는 원문 텍스트를 검색 가능한 토큰으로 바꾸는 파이프라인이다. 먼저 character filter(HTML 태그 제거 등, 선택)를 거치고, tokenizer(예: standard tokenizer가 공백·구두점 기준으로 단어를 쪼갬) 하나를 반드시 거친 뒤, token filter(소문자화, 불용어 제거, 어간추출 등, 여러 개 연쇄 가능)를 순서대로 적용한다. 이 파이프라인이 검색 결과의 품질을 좌우한다 — 예를 들어 '대소문자 구분 없이 검색되길 원한다'면 lowercase filter가 analyzer에 포함돼야 하고, 색인 시 analyzer와 검색 시 analyzer가 다르면(또는 색인 시에만 적용되고 검색 쿼리는 다른 처리를 거치면) 기대한 매칭이 안 될 수 있다.

핵심 포인트

  • analyzer = (character filter, 선택) → tokenizer(필수, 1개) → token filter(여러 개 연쇄 가능)
  • 색인 시 analyzer와 검색 시 analyzer가 어긋나면 기대한 매칭이 안 될 수 있다

text vs keyword — 같은 문자열, 다른 목적

text 타입은 analyzer를 거쳐 여러 토큰으로 쪼개져 색인된다 — '전문 검색'(부분 일치, 형태소 변형 매칭)에 쓴다. keyword 타입은 analyzer 없이 문자열 전체를 하나의 값으로 그대로 색인한다 — 정확히 일치하는 값 필터링, 정렬, 집계(aggregation)에 쓴다. 예를 들어 country 필드에 'South Korea'가 들어있을 때, text로 색인하면 'South'나 'Korea'만으로도 매칭되지만 term 집계로 '나라별 집계'를 하면 'South'와 'Korea'가 따로 카운트되는 원치 않는 결과가 나온다(fielddata 활성화 없이는 text 필드에 집계 자체가 아예 막혀 있기도 하다). 그래서 실무에서는 같은 필드를 text(전문검색용)와 keyword(정확매칭·집계용) 두 서브필드로 동시에 매핑하는 multi-field 패턴을 자주 쓴다.

핵심 포인트

  • text = analyzer로 토큰화되어 전문 검색용, keyword = 그대로 하나의 값으로 정확매칭·정렬·집계용
  • 집계는 keyword(또는 숫자/날짜)에 하는 게 정석 — text에 집계하려면 fielddata를 켜야 하는데 메모리 부담이 커 지양된다
  • 실무에서는 같은 필드를 text+keyword 두 서브필드로 매핑하는 multi-field 패턴을 자주 쓴다