데이터베이스/엘라스틱서치

elasticsearch. range query 와 bool query [엘라스틱 스택 개발부터 운영까지]

ttoance 2023. 3. 21. 22:45

범위 쿼리 range query

- 특정 날짜나 숫자의 범위를 지정해 범위 안에 포함된 데이터들을 검색할 때 사용된다. 

- 날짜/숫자/IP 타입의 데이터는 범위 쿼리가 가능하지만, 문자형, 키워드 타입의 데이터에는 범위 쿼리를 사용할 수 없다. 

GET kibana_sample_data_flights/_search
{
  "query": {
    "range": {
      "timestamp": {
        "gte": "2020/12/15",
        "lte": "2020/12/16"
      }
    }
  }
 
}

참고로, 날짜/시간 포맷이 맞아야 검색이 가능하므로, '2020-12-15', '2020-12-16'으로 검색 시 결과가 나오지 않는다. 

 

<검색 범위 지정하는 파라미터>

gte (gte: 10) 10과 같거나 10 보다 큰 값
(gte: 2021-01-21) 2021년 1월 21일이거나 그 이후의 날짜 
gt (gt: 10) 10보다 큰 값
(gt: 2021-01-21) 2021년 1월 21일 이후의 날짜(2021년 1월 21은 포함되지 않음) 
lte (lte: 10) 10과 같거나 10 보다 작은 값
(lte: 2021-01-21) 2021년 1월 21일이거나 그 이전의 날짜 
lt (lt: 10) 10보다 작은 값
(lt: 2021-01-21) 2021년 1월 21일 이전 날짜(2021년 1월 21은 포함되지 않음) 

 

GET kibana_sample_data_flights/_search
{
  "query": {
    "range": {
      "timestamp": {
        "gte": "now-1M"
      }
    }
  }
}

 

<날짜/시간 관련 범위 표현식>

표현식 설명
now 현재 시각 
now + 1d 현재 시각 + 1
now + 1h + 30m + 10s 현재 시각 + 1시, 30분, 10초
2023-01-21 || + 1M 2023-01-21 + 1달

 

<날짜/시간 단위 표기법>

시간 단위 의미 시간 단위 의미 시간 단위 의미
y(year) M(month) w(weeks)
d(days) H 또는 h(hours) m(minutes)
s(seconds)        

 

<범위 데이터 타입>

GET range_test_index/_search
{
  "query": {
    "range": {
      "test_date": {
        "gte": "2023-01-21",
        "lte": "2023-01-28",
        "relation": "within"
      }
    }
  }
}
설명
intersects(기본값) 쿼리 범위 값이 도큐먼트의 범위 데이터를 일부라도 포함하기만 하면 된다.
contains 도큐먼트의 범위 데이터가 쿼리 범위 값을 모두 포함해야 한다.
within 도큐먼트의 범위 데이터가 쿼리 범위 값 내에 전부 속해야 한다.

 

ex, 

Document1: 10 - 19

Document2 : 20 - 29

Document3 : 30 - 39

Document4 : 40 - 49

 

--- 결과 

15 ~ 40 + intersects => Document1, Document2, Document3, Document4

15 - 45 + within => Document2, Document3 

25 - 29 + contains => Document2

25 - 25 + contains => X 

 

논리 쿼리 bool

- compound query 중의 하나이다. 

GET <index>/_search
{
   "query": {
      "bool": {
         "must": [
            { 쿼리문 }, ...
         ],
         "must_not": [
            { 쿼리문 }, ...
         ],
         "should": [
            { 쿼리문 }, ...
         ],
         "filter": [
            { 쿼리문 }, ...
         ]
      }
   }
}
타입 설명
must 쿼리를 실행하여 참인 도큐먼트를 찾는다.
  복수의 쿼리를 실행하면 AND 연산을 한다.
must_not 쿼리를 실행하여 거짓인 도큐먼트를 찾는다.
  다른 타입과 같이 사용할 경우 도큐먼트에서 제외한다.
should 단독으로 사용 시 쿼리를 실행하여 참인 도큐먼트를 찾는다.
  복수의 쿼리를 실행하면 OR 연산을 한다.
  다른 타입과 같이 사용할 경우 스코어에만 활용된다. => 검색 순위 최적화 가능 
filter 쿼리를 실행하여 '예/아니오' 형식의 필터 컨텍스트를 수행한다. => 불필요한 스코어 계산을 줄여 검색 성능을 높일 수 있다. 

 

 


아래 책 <엘라스틱 스택 개발부터 운영까지> 4.7, 4.8을 읽고 정리한 글입니다.

http://www.yes24.com/Product/Goods/103030516

 

엘라스틱 스택 개발부터 운영까지 - YES24

데이터를 처리하는 데 서로 잘 맞지도 않는 오픈소스 기술들을 굳이 동원해야 할까? 제각각인 오픈소스들을 통합하고 운영하느라 지친 개발자와 운영자들을 위한 솔루션! 이제 엘라스틱 스택

www.yes24.com

 

반응형