브렌쏭의 Veritas_Garage

[Elastic] QueryDSL 본문

카테고리 없음

[Elastic] QueryDSL

브렌쏭 2024. 8. 13. 10:18

QueryDSL

QueryDSL은 자바에서 사용할 수 있는 쿼리 빌더 라이브러리이다.

SQL을 자바 코드로 작성할 수 있어서,
쿼리문을 문자열로 작성하는 것보다 가독성이 높아진다.
또한, 컴파일 시점에 쿼리 오류를 잡을 수 있어서 안전하다.


Elastic Search & Query DSL

  • Elastic Search는 Query DSL을 사용하여 검색을 수행한다.
    • Query DSL은 JSON 형태로 쿼리를 작성한다.
  • Query DSL은 다음과 같은 구조로 이루어져 있다.
    • Query: 검색할 데이터를 지정한다.
    • Filter: 검색 결과를 필터링한다.
    • Aggregation: 검색 결과를 집계한다.
    • Sort: 검색 결과를 정렬한다.
    • Highlight: 검색 결과 중 일부를 강조한다.
    • Source Filtering: 검색 결과 중 일부 필드만 가져온다.

Query DSL 예시

{
  "query": {
    "match": {
      "title": "elasticsearch"
    }
  },
  "sort": [
    {
      "date": "desc"
    }
  ]
}

With REST API

Query DSL은 REST API를 통해 사용할 수 있다.

REST API 예시

GET /_search
{
  "query": {
    "match": {
      "title": "elasticsearch"
    }
  },
  "sort": [
    {
      "date": "desc"
    }
  ]
}

Match AND Term Query

Match 쿼리와 Term 쿼리를 조합하여 검색할 수 있다.

Match 쿼리는 텍스트를 기반으로 검색하고,
Term 쿼리는 정확한 값으로 검색한다.

Match AND Term Query 예시

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "elasticsearch"
          }
        },
        {
          "term": {
            "tag": "search"
          }
        }
      ]
    }
  }
}

Range Query

Range 쿼리는 범위를 지정하여 검색할 수 있다.

  • gte: 이상, gt: 초과, lte: 이하, lt: 미만
  • format: 날짜 형식을 지정할 수 있다.
  • time_zone: 시간대를 지정할 수 있다.
  • boost: 가중치를 지정할 수 있다.
  • relation: 겹치는 범위를 지정할 수 있다.

Range Query 예시

{
  "query": {
    "range": {
      "date": {
        "gte": "2021-01-01",
        "lte": "2021-12-31",
        "format": "yyyy-MM-dd",
        "time_zone": "+09:00",
        "boost": 2.0,
        "relation": "within"
      }
    }
  }
}

가중치

  • 가중치를 지정하면 검색 결과의 순서를 조절할 수 있다.
  • 가중치가 높은 문서가 먼저 나타난다.

Bool Query

Bool 쿼리는 여러 쿼리를 조합하여 검색할 수 있다.

  • must: 모든 쿼리가 일치하는 문서를 검색한다.
  • should: 적어도 하나의 쿼리가 일치하는 문서를 검색한다.
  • must_not: 쿼리가 일치하지 않는 문서를 검색한다.
  • filter: 쿼리가 일치하는 문서를 검색한다.
  • minimum_should_match: should 쿼리의 최소 일치 개수를 지정할 수 있다.

Bool Query 예시

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "elasticsearch"
          }
        }
      ],
      "should": [
        {
          "term": {
            "tag": "search"
          }
        }
      ],
      "must_not": [
        {
          "range": {
            "date": {
              "lt": "2021-01-01"
            }
          }
        }
      ],
      "filter": [
        {
          "range": {
            "date": {
              "gte": "2021-01-01"
            }
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

Aggregation

Aggregation은 검색 결과를 집계할 수 있다.

  • terms: 특정 필드의 값을 그룹화한다.
  • range: 범위를 지정하여 그룹화한다.
  • date_histogram: 날짜를 기준으로 그룹화한다.
  • avg: 평균 값을 계산한다.
  • sum: 합계 값을 계산한다.
  • min: 최소 값을 계산한다.
  • max: 최대 값을 계산한다.
  • stats: 평균, 합계, 최소, 최대 값을 계산한다.
  • cardinality: 고유한 값을 계산한다.

HyperLogLog

HyperLogLog은 고유한 값을 추정하는 알고리즘이다.

  • 정확한 값을 계산하지 않고, 추정값을 계산한다.
  • 메모리 사용량이 적다.
  • 집합의 크기가 커질수록 정확도가 높아진다.

HyperLogLog 예시

{
  "aggs": {
    "unique_count": {
      "cardinality": {
        "field": "user_id"
      }
    }
  }
}
Comments