본문 바로가기
Opensearch

OpenSearch QueryDSL - 날짜 형식, 날짜 연산

by #Glacier 2024. 4. 3.
반응형

사용 가능한 날짜 필드는 세 가지 형태가 있다.

 

1) Opensearch 내부에 저장되는 형태인 Epoch 이후의 밀리초 형태

    Epoch란 보통 1970년 1월 1일 00:00:00 UTC를 의미하고, 이 값은 양수여야 한다.

    우리가 알고 있는 컴퓨터 시스템에서 널리 사용되는  Unix Time (유닉스 타임) 이라고 불리는 것과 일치한다.

    예를 들면, 1613401200 은 2021년 2월 16일 00:00:00을 밀리초로 변환한 값이다.

    - epoch_millis 

 

2) 서식화된 문자열 (Formatted String)

    이 형식은 특정 형식으로 표시하는 문자열로, 사람이 읽고 이해하기 쉬운 형태이다.

    예를 들면, "2022-09-01T00:00:00" 은 ISO8601 형식에 따라 표현된 문자열이다.

    

3) Integer Value (초로 변환된 숫자)

    이 형식은 에포크 이후의 초 값에 해당한다. 밀리초와 다르게 초 값으로 표현되며, 양수여야 한다.

    예를 들면 1613401 은 2021년 2월 16일 00:00:00을 초로 변환한 값이다.

    - epoch_second 

 

서식화된 문자열 중에서는 다양한 방식이 있다.

 

Dates

 

basic_date_time : “yyyyMMddTHHmmss.SSSZ”
“20190323T213446.123-04:00”

- basic_date_time_no_millis : “yyyyMMddTHHmmssZ”
“20190323T213446-04:00”

basic_date : “yyyyMMdd”
“20190323”

 

Times

 

basic_time : “HHmmss.SSSZ”
“213446.123-04:00”

basic_time_no_millis : “HHmmssZ”
“213446-04:00”

 

그 외의 다양한 형식은 아래의 링크에서 찾아볼 수 있다.

https://opensearch.org/docs/latest/field-types/supported-field-types/date/

 

Date

Date field type

opensearch.org

 

이런 날짜 형식 중에서도 맞춤 (커스텀 날짜 형식)도 가능하다.

PUT testindex
{
  "mappings" : {
    "properties" :  {
      "release_date" : {
        "type" : "date",
        "format" : "MM/dd/yyyy"
      }
    }
  }
}
GET testindex/_search
{
  "query" : {
    "match": {
      "release_date" : {
        "query": "03/21/2019"
      }
    }
  }
}
GET testindex/_search
{
  "query": {
    "range": {
      "release_date": {
        "gte": "2019-01-01",
        "lte": "2019-12-31",
        "format": "yyyy-MM-dd"
      }
    }
  }
}

 

날짜 간의 연산도 가능하다.

 

1) + : 덧셈

2) - : 빼기

3) / : 반올림

 

다음의 시간단위를 지원한다.

y(년), M(월), w(주), d(일), h 또는 H (시), m(분), s(초)

 

예시>

now+1M

2022-05-18||/M  -> 2022-05-01

2022-05-18T15:23||/h -> 2022-05-18T15

2022-05-18T15:23:17.789||+2M-1d/d -> 2022-07-17

 

날짜의 계산과 연산을 이용한 예제

GET testindex/_search
{
  "query": {
    "range": {
      "release_date": {
        "gte": "2022-09-14T15:23||/d",
        "lte": "2022-09-14||+2M+1d"
      }
    }
  }
}

 

반응형