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,
...
}
}
}
}
연산자 외에도 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