본문 바로가기
Opensearch

OpenSearch QueryDSL - 용어 수준 쿼리 - Range, Regexp

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

필드의 값 범위를 검색하기 위해서는 range를 사용한다.

 

값이 10보다 크거나 같고, 20보다는 작거나 같은 문서를 검색하는 쿼리

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

 

범위 쿼리에서 필드 매개변수는 아래와 같은 연산자 매개변수를 허용한다.

  • gte: 이상
  • gt: 보다 큰
  • lte: 작거나 같음
  • lt: 미만

2019년에 추가된 제품을 모두 찾는 쿼리

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

 

날짜간의 범위를 설정할 때 지원되는 날짜 형식은 

2024.02.16 - [OpenSearch] - OpenSearch QueryDSL - 날짜 형식, 날짜 연산 https://devops-study.tistory.com/5

 

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

사용 가능한 날짜 필드는 세 가지 형태가 있다. 1) Opensearch 내부에 저장되는 형태인 Epoch 이후의 밀리초 형태 Epoch란 보통 1970년 1월 1일 00:00:00 UTC를 의미하고, 이 값은 양수여야 한다. 우리가 알고

devops-study.tistory.com

 

위의 글을 통해서 날짜 관련하여 확인해보면 된다.

 

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"
      }
    }
  }
}

 

위와 같은 요청을 했다면,

실질적으로 2022-01-01T23:59:59.999999999Z로 채워지게 된다.

즉, 2022년 1월 1일이 00시가 아닌, 23시 59분 59초 99999...가 되는 것이다.

 

시작점에서 1년과 1일을 빼는 계산식

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

 

범위 계산에서는 다음과 가은 선택적 매개변수도 사용이 가능하다.

 

* format : 이 쿼리의 날짜 형식

* relation : INTERSECTS(기본값) - 교차하는 문서를 일치시킵니다. 

                 CONTAINS - 필드 값이 쿼리에 제공된 전체 범위를 포함하는 문서를 일치시킨다.

                 WITHIN - 필드 값이 쿼리에 제공된 범위 내에 있는 문서를 일치시킨다.

* boost : 지정된 승수만큼 쿼리를 강화한다. 둘 이상의 쿼리가 포함된 검색에 유용하다.

            (0~1 사이) 값은 관련성을 감소시키고 1보다 큰 값은 관련성을 증가시킨다. 기본값은 1

* time_zone : date 쿼리에서 값을 UTC로 변환하는 데 사용하는 시간대.

 

 

두 번째는 regexp 정규식 쿼리이다.

다음 쿼리는 대문자 또는 소문자로 시작하고 다음 amlet이 오는 모든 글자를 검색한다.

GET shakespeare/_search
{
  "query": {
    "regexp": {
      "play_name": "[a-zA-Z]amlet"
    }
  }
}

 

복잡한 정규식 쿼리로써 테스트는 좋지만, 와일드카드 패턴과 같이 많은 패턴이 매칭되는 패턴은

굉장히 비싼(expensive) 즉, 연산이 비용이 큰 작업이므로 search.allow_expensive_queires = true로 설정하여야 한다.

 

PUT _cluster/settings
{
  "persistent": {
    "search.allow_expensive_queries": true
  }
}

 

반응형