Elasticsearch: 숫자 데이터 타입 (long, double, scaled_float 등) 완벽 정리
Elasticsearch는 **정수(Integer)와 실수(Float)**를 저장할 수 있도록 다양한 숫자 타입을 제공합니다.
✔ 정수 타입: long, integer, short, byte
✔ 실수 타입: double, float, half_float, scaled_float
이번 글에서는 각 숫자 타입의 특징, 주요 옵션, 그리고 실전 적용 예제까지 상세히 알아보겠습니다.
1. Elasticsearch에서 숫자 타입
🔹 기본 숫자 타입
Elasticsearch는 자바(Java)에서 사용되는 기본 숫자 타입을 지원합니다.
타입 | 설명 | 범위 |
long | 64비트 정수 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
integer | 32비트 정수 | -2,147,483,648 ~ 2,147,483,647 |
short | 16비트 정수 | -32,768 ~ 32,767 |
byte | 8비트 정수 | -128 ~ 127 |
double | 64비트 부동소수점 | 매우 큰 실수값 저장 가능 |
float | 32비트 부동소수점 | 일반적인 실수 저장 |
half_float | 16비트 부동소수점 | 작은 크기의 실수 저장 |
scaled_float | 부동소수점을 정수(long)로 저장하며, 소수점 위치 지정 가능 | scaling_factor 사용 |
2. 숫자 필드의 주요 옵션
Elasticsearch의 숫자 필드는 text, keyword와 일부 동일한 옵션을 가집니다.
옵션 | 설명 | 기본값 |
index | 색인 여부 (검색 가능 여부) | true |
doc_values | 집계/정렬을 위한 최적화된 저장 방식 사용 여부 | true |
boost | 검색 시 가중치 부여 | 1 |
coerce | 자동 형 변환 허용 여부 | true |
null_value | null 값이 입력될 경우 기본값 설정 | 없음 |
ignore_malformed | 잘못된 숫자 입력 시 오류를 무시하고 저장할지 여부 | false |
3. 정수(Integer) 타입 예제
📌 예제 1: 정수 타입 매핑 설정
PUT my_index
{
"mappings": {
"properties": {
"price": {
"type": "integer",
"coerce": true
}
}
}
}
🔹 설명:
- "coerce": true → 4.5, "5" 등의 값도 4 또는 5로 자동 변환되어 저장됨 ✅
4. 실수(Floating Point) 타입 예제
📌 예제 2: 실수 타입 매핑 설정
PUT my_index
{
"mappings": {
"properties": {
"rating": {
"type": "float",
"coerce": true
}
}
}
}
🔹 설명:
- "rating": 4.7 → 그대로 저장됨 ✅
5. Scaled Float (소수점 고정형 실수)
🔹 Scaled Float이란?
✔ 부동소수점을 정수(long)로 변환하여 저장
✔ 소수점 위치를 scaling_factor로 조정
✔ 금액($19.99)과 같은 고정 소수점 데이터에 유용
📌 예제 3: scaled_float 타입 매핑 설정
PUT my_index
{
"mappings": {
"properties": {
"price": {
"type": "scaled_float",
"scaling_factor": 100
}
}
}
}
🔹 설명:
- "price": 19.99 → 1999로 변환 후 저장됨 ✅
- "price": 100.25 → 10025로 저장됨 ✅
📌 주의:
scaling_factor: 100 이므로 두 자리 소수점까지 저장 가능
- scaling_factor: 10 → 1자리 소수점까지만 저장 가능
6. 숫자 필드의 중요한 옵션 실전 예제
📌 예제 4: 숫자 필드에서 coerce, null_value, ignore_malformed 활용
PUT my_index
{
"mappings": {
"properties": {
"quantity": {
"type": "integer",
"coerce": true,
"null_value": 0,
"ignore_malformed": true
}
}
}
}
🔹 설명:
- "coerce": true → "4.5", "6" 등의 값도 정수로 변환 ✅
- "null_value": 0 → null 값이 입력되면 0으로 저장 ✅
- "ignore_malformed": true → 숫자가 아닌 값이 입력되면 오류 없이 저장하되, 검색 및 집계에서 무시 ✅
7. 숫자 필드의 동적 매핑 문제점
✔ 숫자 필드를 동적으로 생성하면 위험할 수 있음
✔ 첫 번째 값이 4 같은 정수라면 long으로 자동 생성
✔ 이후에 5.5 같은 실수가 들어오면 자동 변환되지만 실제로는 5가 저장됨
📌 잘못된 동적 매핑 예제
PUT my_index/_doc/1
{
"value": 4
}
PUT my_index/_doc/2
{
"value": 5.5
}
🔹 문제:
- value 필드가 long으로 자동 생성됨
- 5.5가 입력되었지만 5로 저장됨 (소수점 손실 발생) ❗
✅ 해결 방법: 명시적 매핑 설정 사용!
PUT my_index
{
"mappings": {
"properties": {
"value": {
"type": "float"
}
}
}
}
📌 이제 5.5가 올바르게 저장됨! ✅
8. 정리
개념 | 설명 |
long, integer, short, byte | 정수 타입 (64비트, 32비트, 16비트, 8비트) |
double, float, half_float | 부동소수점 실수 (정확도 차이) |
scaled_float | 부동소수점을 long 형태로 변환하여 저장 (scaling_factor 필요) |
coerce | 문자열 숫자를 자동 변환 ("4.5" → 4) |
null_value | null 값이 입력될 경우 기본값 설정 |
ignore_malformed | 잘못된 숫자 입력 시 오류 없이 무시 |
9. 학습 가이드
1️⃣ 각 숫자 타입을 사용하여 데이터를 저장하고 검색하는 실습 진행
2️⃣ coerce, null_value, ignore_malformed 옵션을 활성화하고 동작 방식 실험
3️⃣ scaled_float을 활용하여 금액 데이터를 저장하고 검색 테스트
4️⃣ 동적 매핑으로 인한 문제를 직접 경험하고 해결 방법 적용
10. 마무리
Elasticsearch에서 숫자 타입을 올바르게 설정하는 것은 데이터의 정확성과 검색 성능을 높이는 중요한 요소입니다.
특히 정수 vs 실수, scaled_float 활용, 동적 매핑의 위험성을 이해하고 적절한 설정을 적용하는 것이 중요합니다.
다음 학습에서는 날짜(Date) 타입을 활용한 검색 및 최적화 방법을 다루겠습니다! 🚀
'Elastic Search > 인덱스 설정과 매핑' 카테고리의 다른 글
[Mappings] Boolean(불리언) 타입 완벽 정리 (0) | 2025.02.03 |
---|---|
[Mappings] 날짜(Date) 타입 완벽 정리 (0) | 2025.02.03 |
[Mappings] 문자열 [ text, keyword ] (0) | 2025.02.03 |
[Elasticsearch] 매핑(Mappings) (0) | 2025.02.03 |
[Elasticsearch] 설정(Settings) 이해하기 (0) | 2025.02.03 |