필드의 값 범위를 검색하기 위해서는 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에서는 누락된 날짜 구성 요소는 아래와 같이 채운다.
연도는 채워지지 않는다.
- 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
}
}
'Opensearch' 카테고리의 다른 글
OpenSearch QueryDSL - 날짜 형식, 날짜 연산 (1) | 2024.04.03 |
---|---|
OpenSearch QueryDSL - 용어 수준 쿼리 - IDs, prefix (0) | 2024.04.03 |
OpenSearch QueryDSL - 용어 수준 쿼리 - exists, fuzzy (1) | 2024.04.03 |
OpenSearch QueryDSL - 쿼리 기초 (1) | 2024.04.03 |