Elasticsearch: 날짜(Date) 타입 완벽 정리
Elasticsearch에서 날짜(Date) 타입은 ISO8601 형식을 따르며, 다양한 날짜 포맷을 지원합니다.
✔ ISO8601 기본 형식: "2019-06-12T17:13:40.428Z"
✔ epoch_millis: 1970-01-01 00:00:00부터 경과한 밀리초
✔ 사용자 정의 포맷 설정 가능
이번 글에서는 날짜 타입의 기본 개념, 주요 옵션, 포맷 지정 방법, 그리고 Range Query 활용법까지 상세히 알아보겠습니다.
1. Elasticsearch에서 날짜(Date) 타입의 기본 개념
🔹 기본 날짜 형식 (ISO8601)
Elasticsearch는 ISO8601 형식을 기본적으로 지원합니다.
📌 자동으로 날짜로 인식되는 형식 예제
"2019-06-12"
"2019-06-12T17:13:40"
"2019-06-12T17:13:40+09:00"
"2019-06-12T17:13:40.428Z"
✅ 위 형식으로 입력하면 자동으로 날짜 타입으로 저장됨
📌 자동으로 문자열(text)로 저장되는 잘못된 날짜 형식 예제
"2019/06/12 12:10:30" // "/" 사용 (기본 설정에서는 text로 저장됨)
✅ 이 경우 format 옵션을 설정해야 날짜로 저장 가능!
2. 날짜(Date) 타입 필드 설정
🔹 기본 날짜 타입 매핑 예제
PUT my_date
{
"mappings": {
"properties": {
"date_val": {
"type": "date"
}
}
}
}
✅ 기본적으로 ISO8601 형식을 사용하며, long 타입의 epoch_millis도 저장 가능
3. 날짜(Date) 타입의 주요 옵션
Elasticsearch의 날짜 타입 필드는 문자열, 숫자 필드와 일부 동일한 옵션을 가집니다.
옵션 설명 기본값
옵션 | 설명 | 기본값 |
index | 색인 여부 (검색 가능 여부) | true |
doc_values | 집계/정렬을 위한 최적화된 저장 방식 사용 여부 | true |
null_value | null 값이 입력될 경우 기본값 설정 | 없음 |
ignore_malformed | 잘못된 날짜 입력 시 오류를 무시하고 저장할지 여부 | false |
format | 날짜 입력 형식 지정 (여러 개 가능) | `strict_date_optional_tim |
4. 날짜 포맷 설정하기
기본적으로 Elasticsearch는 ISO8601 형식만 지원하지만,
✔ format 옵션을 사용하여 다양한 날짜 형식을 추가할 수 있음
📌 예제 1: 다양한 날짜 형식 지원 (yyyy/MM/dd, yyyy-MM-dd HH:mm:ss, epoch_millis)
PUT my_date
{
"mappings": {
"properties": {
"date_val": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
}
}
}
}
✅ 지원되는 날짜 형식 예제
- "2019-06-10 12:10:30"
- "2019/06/10"
- 1560127830000 (epoch_millis)
5. Elasticsearch에서 지원하는 날짜 포맷
다양한 날짜 포맷을 사용할 수 있으며, 아래와 같은 Joda-Time 심볼을 활용하여 설정할 수 있습니다.
📌 주요 날짜 포맷 심볼
심볼 의미 | 예제 | (2019-09-12T17:13:07.428+09:00) |
yyyy | 년도 | 2019 |
MM | 월(숫자) | 09 |
MMM | 월(문자, 3자리) | Sep |
MMMM | 월(문자, 전체) | September |
dd | 일(숫자) | 12 |
a | 오전/오후 | PM |
HH | 24시간제 시간 (00~23) | 17 |
hh | 12시간제 시간 (01~12) | 05 |
mm | 분 (00~59) | 13 |
ss | 초 (00~59) | 07 |
SSS | 밀리초 | 428 |
Z | 타임존 | +09:00 |
6. 날짜 데이터 저장 및 검색 예제
📌 예제 2: 날짜 데이터 저장 (ISO8601)
PUT my_date/_doc/1
{
"date_val": "2019-09-12 15:01:23"
}
✅ "2019-09-12 15:01:23"이 저장됨
📌 예제 3: Range Query (날짜 범위 검색)
GET my_date/_search
{
"query": {
"range": {
"date_val": {
"gt": "2019/09/10",
"lt": 1568332800000
}
}
}
}
✅ 다른 날짜 포맷을 사용해도 정상적으로 검색됨!
📌 예제 4: 현재 시간(now) 기준 검색
GET my_date/_search
{
"query": {
"range": {
"date_val": {
"gte": "now-1M",
"lt": "now"
}
}
}
}
✅ 최근 1개월 동안의 데이터 검색 가능
7. 날짜 데이터의 내부 저장 방식
✔ 모든 날짜 값은 내부적으로 epoch_millis (1970-01-01 00:00:00 UTC 기준 밀리초)로 변환하여 저장됨
✔ 하지만 검색 시에는 다양한 날짜 형식으로 조회 가능
📌 예제 5: _source 데이터 확인
GET my_date/_doc/1
🔹 결과 예제
{
"_source": {
"date_val": "2019-09-12 15:01:23"
}
}
✔ 날짜 입력 값은 그대로 유지되지만, 내부적으로는 epoch_millis로 변환되어 저장됨
8. 정리
개념 | 설명 |
ISO8601 형식 | 기본 날짜 형식 (2019-06-12T17:13:40.428Z) |
epoch_millis | 1970-01-01 00:00:00 UTC부터의 밀리초 값 |
format 옵션 | 다양한 날짜 형식 지정 가능 (yyyy/MM/dd, epoch_millis 등) |
현재 시간(now) 활용 | now-1d, now-1M 같은 상대적 날짜 검색 가능 |
내부 저장 방식 | 모든 날짜는 epoch_millis로 변환 후 저장됨 |
9. 학습 가이드
1️⃣ ISO8601 형식 및 epoch_millis를 사용하여 데이터 저장 실습
2️⃣ format 옵션을 활용하여 다양한 날짜 형식 적용
3️⃣ Range Query를 사용하여 날짜 범위 검색 실습
4️⃣ 현재 시간(now) 기반 상대적 날짜 검색 테스트
10. 마무리
Elasticsearch의 날짜(Date) 타입은 다양한 포맷을 지원하며, epoch_millis로 변환하여 저장됩니다.
특히 format 옵션, range 쿼리, now 키워드를 활용하면 날짜 데이터를 효과적으로 관리할 수 있습니다.
다음 학습에서는 Range Query를 활용한 고급 날짜 검색 최적화 방법을 다루겠습니다! 🚀
'Elastic Search > 인덱스 설정과 매핑' 카테고리의 다른 글
[Mappings] Object vs Nested 타입 완벽 정리 (0) | 2025.02.03 |
---|---|
[Mappings] Boolean(불리언) 타입 완벽 정리 (0) | 2025.02.03 |
[Mappings] 숫자 데이터 타입 (long, double, scaled_float 등) (0) | 2025.02.03 |
[Mappings] 문자열 [ text, keyword ] (0) | 2025.02.03 |
[Elasticsearch] 매핑(Mappings) (0) | 2025.02.03 |