본문 바로가기

ELK스택

[Elasticsearch] Query DSL : Bool Range

이번 글에서는 2가지를 정리해 보려고 합니다.

  • 복합(Bool) 쿼리 - (must, must_not, should, filter)
  • 범위(Range) 쿼리 - (숫자/날짜값 범위검색)
복합(Bool) 쿼리 - (must, must_not, should, filter)

4가지의 복합쿼리를 알아보기 전에 기본적인 개념을 잡고 가도록하겠습니다.

Bool쿼리는 아래와 같은 4개의 인자를 가지고 있으며, 각 인자 안에 각각의 쿼리를 배열 형식으로 넣도록 되어있습니다.

must : 쿼리가 참인 도큐먼트를 검색합니다.
must_not : 쿼리가 거짓인 도큐먼트를 검색합니다.
should : 이 쿼리에 해당하는 도큐먼트의 점수를 올립니다.
filter : 쿼리가 참인 도큐먼트들만 검색하지만, 점수를 계산하지 않아 must보다 빠른 검색이 가능합니다.
  • must

아래의 쿼리는 message필드에 "quick""lazy dog"가 있는 도큐먼트를 검색한 결과입니다.

  • must_not

아래의 쿼리는 message필드에 "quick"은 들어가지만 "lazy dog"는 없는 도큐먼트를 검색한 결과입니다.

  • should

should같은 경우는 스코어점수에 영향을 주는 특징을 가지고 있습니다.

첫번째 검색결과를 보면 단순 match검색을 통해 4건이 검색되었고, 각각의 스코어 점수에 의해 id값이 1번, 4번, 2번, 3번순으로 검색되었습니다.

두번째 검색결과를 보면 message에 "fox"라는 단어가 들어간 4건의 도큐먼트가 검색된 것은 일치하지만,

should에 의해 스코어점수가 달라져서 검색순위에 변화가 있음을 알 수 있습니다.

즉, 이러한 should쿼리를 사용하면 인터넷 쇼핑몰과 같은 상황에서 사용자들에게 홍보하고 싶은 상품을 사용자들 눈에 가장 먼저 보여주게 되는 효과를 얻을 수 있습니다.

 

  • filter

filter같은 경우에는 스코어점수에는 영향을 주지않지만, 보기 싫은 검색 결과만 제외할때 사용하는 쿼리입니다.

2개의 검색결과를 비교해보면 score점수는 변화가 없다는 것을 알 수 있습니다.

 

범위(Range) 쿼리 - (숫자/날짜값 범위검색)

지금까지는 텍스트쿼리만 알아보았는데, Elasticsearch는 숫자나 날짜와 같은 데이터도 검색 할 수 있는 기능이 있습니다.

그럼 공부하기에 앞서 사용할 데이터를 넣어주겠습니다.

Range 쿼리는 Range : { <필드명>: { <파라메터>:<값> } } 으로 입력됩니다.

Range 쿼리 파라메터는 아래의 4가지가 있습니다.

  1. gte (Greater-than or equal to) - 이상 (같거나 큼)
  2. gt (Greater-than) – 초과 (큼)
  3. lte (Less-than or equal to) - 이하 (같거나 작음)
  4. lt (Less-than) - 미만 (작음)

 

  • 숫자 범위검색

아래는 "price"라는 필드값이 700이상 900미만인 값을 검색하는 쿼리입니다.

  • 날짜 범위검색

아래는 "date"라는 필드값이 "2016-01-01"초과 "2017-01-01"미만인 날짜를 조회하는 쿼리입니다.