상위: Elasticsearch
요약
매핑(Mapping)은 문서의 필드와 데이터 타입을 정의하는 것으로, RDB의 스키마와 유사합니다.
Mapping 종류
Dynamic Mapping
- 데이터 입력 시 자동으로 필드 타입을 추론하여 매핑을 생성합니다.
- 장점: 편리함.
- 단점: 잘못된 타입으로 매핑될 수 있음 (예: 날짜가 문자열로).
Dynamic Parameter
es.indices.create(index="products", body={"mappings": {"dynamic": "runtime"}})
| 설정값 | 동작 |
|---|---|
true | 새로운 필드 자동 추가 (기본값) |
runtime | 색인하지 않고 쿼리 시 로드 |
false | 새로운 필드 무시 |
strict | 필드 추가 시 오류 발생 |
Static Mapping
- 사용자가 미리 필드 타입을 명시적으로 정의합니다.
- 장점: 정확한 데이터 모델링, 검색 성능 최적화, 저장 공간 절약.
- 한 번 설정되면 일부 변경 제한
{
"mappings": {
"properties": {
"name": {"type": "text"},
"brand": {"type": "keyword"},
"price": {"type": "float"},
"category": {"type": "keyword"},
"rating": {"type": "float"}
}
}
}
주요 Field Types
문자열 (String)
text
- 전문 검색(Full-text Search)용
- Analyzer에 의해 토큰화
- 부분 검색 가능, 문서 간 유사도 검색에 적합 (BM25)
변형 타입:
match_only_text: 점수 매기지 않음, 로그 분석용search_as_you_type: 자동완성 검색 지원
keyword
- 정확한 값 일치(Exact Match), 정렬, 집계용
- 분석되지 않고 원문 그대로 저장
- 적합 용도: 브랜드명, ID, 태그, 카테고리
변형 타입:
constant_keyword: 고정된 단일 값, 수정 불가wildcard: 부분 일치/패턴 검색용 (*,?사용)
기타
- Numeric:
long,integer,short,byte,double,float등 - Date: 날짜 및 시간
- Boolean:
true,false - Object & Nested: 계층 구조 데이터.
nested는 배열 내 객체의 독립성 보장 - Geo:
geo_point,geo_shape
Index 관련 개념
Forward Index vs Inverted Index
Forward Index (정방향)
- 문서 기준 인덱싱, 문서 내용 파악에 유리
문서 1 → ["Elasticsearch", "검색", "엔진"]
Inverted Index (역방향)
- Elasticsearch 기본 방식, 빠른 검색 가능
"검색" → [문서 1]
field data vs doc_value
| 속성 | field data | doc_value |
|---|---|---|
| 저장 위치 | 메모리 | 디스크 |
| 용도 | text 필드 정렬/집계 | keyword 필드 기본 |
| 단점 | 메모리 사용량 증가 | - |
Index Alias
인덱스에 가상의 이름을 부여하여 여러 인덱스를 하나처럼 사용하거나, 무중단 교체가 가능합니다.
PUT /products
{
"aliases": {
"products_alias": {}
}
}
무중단 인덱스 변경
POST /_aliases
{
"actions": [
{ "remove": { "index": "products", "alias": "products_alias" }},
{ "add": { "index": "products_v2", "alias": "products_alias" }}
]
}