Range 쿼리

Range 쿼리

필드에서 값의 범위를 검색할 때 range 쿼리를 사용해요. 숫자, 날짜, 문자열 값에 대한 범위 조건을 지정할 수 있어요. 이 글에서는 연산자, 날짜 필드 처리, 상대 날짜, 시간대 등을 살펴봐요.

출처: 문서

본문

필드에서 값의 범위를 검색할 때 range 쿼리를 사용해요. line_id 값이 >= 10이고 <= 20인 문서를 검색하려면 다음 요청을 사용하세요:

GET shakespeare/_search
{
  "query": {
    "range": {
      "line_id": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

연산자 (Operators)

range 쿼리의 field 파라미터는 다음 선택적 연산자 파라미터를 받아요:

  • gte: 크거나 같음 (Greater than or equal to)
  • gt: 큼 (Greater than)
  • lte: 작거나 같음 (Less than or equal to)
  • lt: 작음 (Less than)

날짜 필드 (Date fields)

날짜가 포함된 필드에서 range 쿼리를 사용할 수 있어요. 예를 들어 products 인덱스가 있고 2019년에 추가된 모든 상품을 찾고 싶다고 가정해 봐요:

GET products/_search
{
  "query": {
    "range": {
      "created": {
        "gte": "2019/01/01",
        "lte": "2019/12/31"
      }
    }
  }
}

지원되는 날짜 형식에 대한 자세한 내용은 Formats를 참고하세요.

형식 (Format)

쿼리에서 필드의 매핑된 형식과 다른 날짜 형식을 사용하려면 format 필드에 지정하세요. 예를 들어 products 인덱스가 created 필드를 strict_date_optional_time으로 매핑했다면, 쿼리 날짜에 대해 다음과 같이 다른 형식을 지정할 수 있어요:

GET /products/_search
{
  "query": {
    "range": {
      "created": {
        "gte": "01/01/2022",
        "lte": "31/12/2022",
        "format":"dd/MM/yyyy"
      }
    }
  }
}

누락된 날짜 구성 요소 (Missing date components)

OpenSearch는 누락된 날짜 구성 요소를 다음 값으로 채워요: MONTH_OF_YEAR: 01 DAY_OF_MONTH: 01 HOUR_OF_DAY: 23 MINUTE_OF_HOUR: 59 SECOND_OF_MINUTE: 59 NANO_OF_SECOND: 999_999_999 연도가 없으면 채워지지 않아요. 예를 들어 시작 날짜에 연도만 지정하는 다음 요청을 살펴봐요:

GET /products/_search
{
  "query": {
    "range": {
      "created": {
        "gte": "2022",
        "lte": "2022-12-31"
      }
    }
  }
}

시작 날짜는 기본값으로 채워지므로, 사용되는 gte 파라미터는 2022-01-01T23:59:59.999999999Z예요.

상대 날짜 (Relative dates)

날짜 수학(date math)을 사용해 상대 날짜를 지정할 수 있어요. 지정된 날짜에서 1년과 1일을 빼려면 다음 쿼리를 사용하세요:

GET products/_search
{
  "query": {
    "range": {
      "created": {
        "gte": "2019/01/01||-1y-1d"
      }
    }
  }
}

앞선 예제에서 2019/01/01은 날짜 수학의 기준 날짜(anchor date, 시작점)예요. 두 개의 파이프 문자(||) 뒤에는 기준 날짜에 상대적인 수학식을 지정해요. 이 예제에서는 1년(-1y)과 1일(-1d)을 빼고 있어요. 날짜나 시간 단위에 슬래시(/)를 추가해 날짜를 반올림할 수도 있어요. 지난 1년 안에 추가됐고 월 단위로 반올림된 상품을 찾으려면 다음 쿼리를 사용하세요:

GET products/_search
{
  "query": {
    "range": {
      "created": {
        "gte": "now-1y/M"
      }
    }
  }
}

now 키워드는 현재 날짜와 시간을 가리켜요.

상대 날짜 반올림 (Rounding relative dates)

다음 표는 상대 날짜가 어떻게 반올림되는지 설명해요. Parameter Rounding rule Example: The value 2022-05-18||/M is rounded to gt | 반올림 구간에 해당하지 않는 첫 밀리초로 올림해요. | 2022-06-01T00:00:00.000 gte | 첫 밀리초로 내림해요. | 2022-05-01T00:00:00.000 lt | 반올림된 날짜 직전의 마지막 밀리초로 내림해요. | 2022-04-30T23:59:59.999 lte | 반올림 구간의 마지막 밀리초로 올림해요. | 2022-05-31T23:59:59.999

시간대 (Time zone)

기본적으로 날짜는 협정 세계시(UTC)로 간주돼요. 쿼리에 time_zone 파라미터를 지정하면 제공된 날짜 값이 UTC로 변환돼요. time_zone 파라미터는 -04:00 같은 UTC 오프셋이나 America/New_York 같은 IANA 시간대 ID로 지정할 수 있어요. 예를 들어 다음 쿼리는 제공된 gte 날짜가 -04:00 시간대임을 지정해요:

GET /products/_search
{
  "query": {
    "range": {
      "created": {
        "time_zone": "-04:00",
        "gte": "2022-04-17T06:00:00"
      }
    }
  }
}

앞선 쿼리의 gte 파라미터는 2022-04-17T10:00:00 UTC로 변환돼요. 이는 2022-04-17T06:00:00-04:00의 UTC 환산값이에요. time_zone 파라미터는 now 값에는 영향을 주지 않아요. now는 항상 UTC의 현재 시스템 시간에 해당하기 때문이에요.

파라미터 (Parameters)

쿼리는 필드 이름()을 최상위 파라미터로 받아요:

GET _search
{
  "query": {
    "range": {
      "": {
        "gt": 10,
        ...
      }
    }
  }
}

연산자 외에도 에 대해 다음 선택적 파라미터를 지정할 수 있어요. Parameter Data type Description format | 문자열(String) | 이 쿼리에서 날짜에 사용할 형식이에요. 기본값은 필드의 매핑된 형식이에요. relation | 문자열(String) | range 쿼리가 range 필드의 값을 어떻게 일치시키는지 나타내요. 유효한 값은 다음과 같아요:

  • INTERSECTS (default): Matches documents whose range field value intersects the range provided in the query.
  • CONTAINS: Matches documents whose range field value contains the entire range provided in the query.
  • WITHIN: Matches documents whose range field value is entirely within the range provided in the query. boost | 부동 소수점(Floating-point) | 이 필드가 관련성 점수에 기여하는 가중치를 지정하는 부동 소수점 값이에요. 1.0보다 큰 값은 필드의 관련성을 높이고, 0.0과 1.0 사이의 값은 관련성을 낮춰요. 기본값은 1.0이에요. time_zone | 문자열(String) | 쿼리에서 날짜 값을 UTC로 변환하는 데 사용하는 시간대예요. 유효한 값은 ISO 8601 UTC 오프셋과 IANA 시간대 ID예요. 자세한 내용은 Time zone을 참고하세요.

search.allow_expensive_queries가 false로 설정되어 있으면 text와 keyword 필드에 대한 range 쿼리는 실행되지 않아요.

Date fieldsFormat

더 알아보기 (Learn more)