Elasticsearch

Elasticsearch Query DSL

illho 2024. 3. 19. 21:30

Bool 복합 쿼리 - Bool Query

query_string 쿼리는 여러 조건을 조합하기에는 용이하지만 옵션이 한정되어 있다.

본문 검색에서 여러쿼리를 조합하기 위해서는 상위에 bool 쿼리를 사용하고 그 안에 다른 쿼리들을 넣는 식으로 사용이 가능하다. bool 쿼리는 4개의 인자를 가지고 있으며 그 인자 안에 다른 쿼리들을 배열로 넣는 방식으로 동작한다.

 

  • must : 쿼리가 참인 도큐먼트들을 검색한다.
  • must_not : 쿼리가 거짓인 도큐먼트들을 검색합니다.
  • should : 검색 결과 중 이 쿼리에 해당하는 도큐먼트의 점수를 높입니다.
  • filter : 쿼리가  참인 도큐먼트를 검색하지만 스코어를 계산하지 않는다. must보다 검색 속도가 빠르고 캐시이 가능하다.

 

명령어

GET <인덱스명>/_search
{
  "query": {
    "bool": {
      "must": [
        { <쿼리> }, …
      ],
      "must_not": [
        { <쿼리> }, …
      ],
      "should": [
        { <쿼리> }, …
      ],
      "filter": [
        { <쿼리> }, …
      ]
    }
  }
}

 

 

ex) good 과 is basketball 이 포함된 모든 문서를 검색하는 쿼리

 

명령어

GET sport_3/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "good"
          }
        },
        {
          "match_phrase": {
            "message": "is basketball"
          }
        }
      ]
    }
  }
}

 

 

결과

 

ex) good 과 is basketball 이 포함되지 않은 모든 문서를 검색하는 쿼리

 

명령어

GET sport_3/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "message": "good"
          }
        },
        {
          "match_phrase": {
            "message": "is basketball"
          }
        }
      ]
    }
  }
}

 

 

결과

 

 

 

범위 쿼리 - Range Query

 

테스트 데이터

PUT sport_4

GET sport_4

POST sport_4/_bulk
{"index":{"_id":1}}
{"model":"soccer ball","price":300,"date":"2014-02-24"}
{"index":{"_id":2}}
{"model":"baseball ball","price":455,"date":"2015-03-15"}
{"index":{"_id":3}}
{"model":"basketball ball","price":669,"date":"2016-02-21"}
{"index":{"_id":4}}
{"model":"tennis ball","price":889,"date":"2017-03-29"}

 

 

조회 결과

 

ragne 쿼리는 range : { <필드명>: { <파라메터>:<값> } } 으로 입력 된다. 

range 쿼리 파라메터는 4가지가 있다.

 

  • gte - 이상 ( 같거나 큼)
  • gt - 초과 (큼)
  • lte - 이하 (같거나 작음)
  • lt - 미만(작음)

price 가 600 이상 900 미만인 데이터를 검색해본다.

 

명령어

GET sport_4/_search
{
  "query" : {
    "range" : {
      "price" : {
        "gte" : 600,
        "lt" : 900
      }
  }
}
}

 

 

결과

 

날짜도 숫자와 마찬가지로 range 쿼리의 사용이 가능하다.

기본적으로 elasticsearch 에서 날짜 값은 2024-03-19 또는 2024-03-19T10:15:30 과 같이 JSON 에서 일반적으로 사용되는 ISO8601 형식을 사용한다.

 

필드의 날짜가 2016년 1월 1일 이후인 도큐먼트들을 검색하는 쿼리이다.

 

명령어

GET sport_4/_search
{
  "query" : {
    "range" : {
      "date" : {
        "gt" : "2016-01-01"
      }
    }
  }
}

 

 

결과

 

쿼리의 날짜 포맷을 다르게 하고 싶다면 format 옵션의 사용이 가능하다. || 을 사용해서 여러 값의 입력이 가능하다.

date 필드의 값이 2015년 12월 31일 부터 2018년 이전 사이 값들을 검색하는 쿼리이다.

 

명령어

GET sport_4/_search
{
  "query": {
    "range": {
      "date": {
        "gt": "31/12/2015",
        "lt": "2018",
        "format": "dd/MM/yyyy||yyyy"
      }
    }
  }
}

 

 

결과

 

 

날짜를 검색 할 때는 검색하는 현재 시간을 가져오는 예약어 now와 y년 M월 d일 h시 m분 s초 w주 등의 사용이 가능하다.

date의 값이 2016년 1월 1일에서 6개월 후인 날 부터 오늘보다 365일 전인 날 사이의 데이터를 가져오는 쿼리이다.

 

명령어

GET sport_4/_search
{
  "query" : {
    "range" : {
      "date" : {
        "gt" : "2016-01-01||+6M",
        "lt" : "now-365d"
      }
    }
  }
}

 

결과

 

 

Reference

https://esbook.kimjmin.net/05-search/5.1-query-dsl