맵핑에 따른 검색 방식
multi-field는 기본적으로 text 필드 → 분석(토큰화)되어 부분검색·유사검색에 쓰이고
동일 데이터를 두 방식으로 동시에 색인하기 위해 사용하는 매핑 기법입니다.
"nickname": {
"type": "text",
"fields": {
"keyword": { "type": "keyword" }
}
}
ES 내부적으로는 nickname 필드에 대해 analyzer가 적용된 inverted index
nickname.keyword 필드에 대해 exact string으로 저장된 inverted index를 동시에 만들어두는 구조입니다.
multi-field = 같은 데이터를 text + keyword 2개로 분리 색인해서
모두를 한꺼번에 커버한다
"nickname": { "type": "text" }
만 선언하면:
ES는 nickname을 analyzer 로 분석해서 토큰화합니다
따라서 match 나 match_phrase 검색에는 잘 동작
예: “홍길동” → “홍”, “길”, “동” 토큰으로 색인
하지만
에서는 text 필드만으로는 불가능 합니다.
왜냐하면 text 필드는 정확히 “홍길동”이라는 원본 문자열을 인덱스에 저장하지 않고, 분석된 토큰으로만 저장하기 때문이에요.
| 구분 | text (단독) | text + keyword (multi-field) |
|---|---|---|
| 유사검색 (match) | 가능 | 가능 |
| 부분검색 | 가능 | 가능 |
| 정확검색 (term) | 불가능 | keyword 필드로 가능 |
| 정렬 (sort) | 불가능 | keyword 필드로 가능 |
| 집계 (aggregation) | 불가능 | keyword 필드로 가능 |
| 사용 용도 | 자유 검색 전용 | 검색 + 정확매칭 + 집계 + 정렬 모두 지원 |
multi-field = text + keyword
→ 검색(유사/부분) + term(정확) + 정렬 + 집계까지 모두 가능하게 해주는 방식