쿼리 DSL (Query DSL) 활용

📌 Elasticsearch의 Query DSL(Domain-Specific Language)은 강력한 검색 기능을 제공하는 JSON 기반의 검색 언어입니다.

  • 다양한 검색 쿼리를 조합하여 원하는 데이터를 빠르게 찾을 수 있음.
  • 기본적인 Match, Term, Bool, Range, Multi-Match 쿼리를 활용할 수 있음.
  • Aggregation(집계) 기능을 사용하여 데이터 분석 가능.

Match Query vs Term Query 차이점

쿼리 유형 설명 적용 대상 필드 형태소 분석
Match Query 형태소 분석을 적용한 검색 (전문 검색) text 타입 O
Term Query 정확한 값 일치 검색 keyword, integer, boolean X

(1) Match Query (전문 검색)

  • text 필드에 대해 형태소 분석을 수행하여 검색.
  • 단어가 포함된 문서들을 검색할 때 사용.
GET /products/_search
{
  "query": {
    "match": {
      "name": "Elasticsearch 책"
    }
  }
}

"name" 필드에서 "Elasticsearch 책"과 관련된 문서 검색.


(2) Term Query (정확한 일치 검색)

  • keyword, integer, boolean 타입 필드에 대해 정확한 값 검색.
  • 필터링 또는 정렬을 수행할 때 사용.
GET /products/_search
{
  "query": {
    "term": {
      "category": "IT"
    }
  }
}

"category"가 정확히 "IT"인 문서 검색.


Bool Query (must, should, must_not, filter)

Bool Query여러 개의 쿼리를 조합하여 검색할 때 사용합니다.

Bool Query 옵션 설명
must 모든 조건을 충족하는 문서 (AND 연산)
should 하나 이상의 조건을 충족하는 문서 (OR 연산)
must_not 해당 조건을 제외 (NOT 연산)
filter 조건을 충족하지만 점수(Score)에 영향을 주지 않음

(1) Bool Query 예제

GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "name": "Elasticsearch" } },
        { "term": { "category": "IT" } }
      ],
      "should": [
        { "match": { "description": "데이터 검색" } }
      ],
      "must_not": [
        { "term": { "stock": false } }
      ],
      "filter": [
        { "range": { "price": { "gte": 20000, "lte": 50000 } } }
      ]
    }
  }
}

설명

  • must: "name" 필드에 "Elasticsearch" 포함 + "category"가 "IT"인 문서.
  • should: "description"에 "데이터 검색"이 포함되면 점수(Score) 증가.
  • must_not: "stock"이 false인 문서는 제외.
  • filter: 가격이 20,000 ~ 50,000 범위 내인 문서만 검색 (점수에 영향 없음).

Range Query (숫자, 날짜 검색)

Range Query는 숫자 또는 날짜 필드에 대해 범위 조건 검색을 수행할 때 사용합니다.

(1) 숫자 범위 검색

GET /products/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 20000,
        "lte": 50000
      }
    }
  }
}

price가 20,000 이상, 50,000 이하인 문서 검색.


(2) 날짜 범위 검색

GET /products/_search
{
  "query": {
    "range": {
      "release_date": {
        "gte": "2023-01-01",
        "lte": "2023-12-31",
        "format": "yyyy-MM-dd"
      }
    }
  }
}

release_date가 2023년 내인 문서 검색.


Multi-Match Query (여러 필드 검색)

Multi-Match Query여러 개의 필드에서 동일한 검색어를 찾을 때 사용합니다.

GET /products/_search
{
  "query": {
    "multi_match": {
      "query": "Elasticsearch",
      "fields": ["name", "description"]
    }
  }
}

"name"과 "description" 필드에서 "Elasticsearch" 포함 문서 검색.


Aggregation(집계) 기본

**Aggregation(집계)**는 데이터를 분석하고 요약할 때 사용합니다.

  • SQL의 GROUP BY, SUM, AVG와 유사한 기능을 제공.
  • 주요 Aggregation 유형
    • Bucket Aggregation → 데이터를 그룹화 (terms, histogram 등).
    • Metric Aggregation → 평균, 합계 계산 (avg, sum, min, max 등).
    • Pipeline Aggregation → 집계 결과를 추가 연산.

(1) 카테고리별 문서 수 집계 (Terms Aggregation)

GET /products/_search
{
  "size": 0,
  "aggs": {
    "category_count": {
      "terms": {
        "field": "category.keyword"
      }
    }
  }
}

"category" 필드의 각 값별 문서 개수 집계.

🔹 응답 예시

{
  "aggregations": {
    "category_count": {
      "buckets": [
        { "key": "IT", "doc_count": 10 },
        { "key": "Electronics", "doc_count": 5 }
      ]
    }
  }
}

✅ "IT" 카테고리에 10개 문서, "Electronics" 카테고리에 5개 문서 존재.


(2) 가격의 평균, 최대, 최소값 집계

GET /products/_search
{
  "size": 0,
  "aggs": {
    "price_stats": {
      "stats": {
        "field": "price"
      }
    }
  }
}

✅ price 필드의 최소값, 최대값, 평균값 계산.

🔹 응답 예시

{
  "aggregations": {
    "price_stats": {
      "min": 15000,
      "max": 60000,
      "avg": 37500,
      "sum": 150000
    }
  }
}

쿼리 DSL 활용 정리

쿼리 유형 설명
Match Query text 필드 검색 (형태소 분석 적용)
Term Query 정확한 일치 검색 (keyword, integer, boolean)
Bool Query must, should, must_not, filter 조건 조합
Range Query 숫자 및 날짜 범위 검색
Multi-Match Query 여러 개의 필드에서 검색
Aggregation 데이터 분석 및 요약

결론

  • Match Query는 형태소 분석을 적용한 검색, Term Query는 정확한 일치 검색.
  • Bool Query를 사용하면 복합 검색 가능.
  • Range Query는 숫자 및 날짜 검색에 활용.
  • Multi-Match Query를 사용하면 여러 필드에서 검색 가능.
  • Aggregation을 사용하면 데이터를 그룹화하고 통계 분석 가능.

 

+ Recent posts