Elasticsearch 쿼리 DSL 마스터하기: 데이터 검색을 위한 필수 명령어

Elasticsearch 검색의 강력한 기능을 활용하려면 쿼리 DSL을 마스터해야 합니다. 이 가이드는 `match`, `term`, 범위 쿼리의 실용적인 사용법에 중점을 두고 필수적인 JSON 쿼리 구조를 분석합니다. 기본 `bool` 쿼리 내에서 `must`(점수 산정)와 `filter`(캐싱) 절의 결정적인 차이점을 학습하여 복잡하고 고성능의 데이터 검색을 효율적으로 구성할 수 있습니다.

39 조회수

Elasticsearch 쿼리 DSL 마스터하기: 데이터 검색을 위한 필수 명령어

Elasticsearch는 방대한 양의 비정형 및 정형 데이터를 처리하는 속도와 유연성으로 잘 알려져 있습니다. 데이터 검색 능력의 핵심에는 강력한 JSON 기반 언어인 쿼리 도메인 특정 언어(Query Domain Specific Language, DSL)가 있습니다. 이는 Search API를 통해 정교한 검색 요청을 정의하는 데 사용됩니다. Query DSL을 이해하는 것은 단순한 키워드 검색을 넘어 정밀하고 필터링된 집계 데이터를 검색하는 데 매우 중요합니다.

이 가이드에서는 Elasticsearch Query DSL의 기본적인 구성 요소들을 안내합니다. 핵심 쿼리 유형을 살펴보고, bool 쿼리를 사용하여 복잡한 로직을 위해 이들을 결합하는 방법을 시연하며, 인덱스에서 효율적인 데이터 검색을 숙달하는 데 도움이 되는 실용적인 예제를 제공할 것입니다.

Elasticsearch 검색 요청의 구조

모든 Elasticsearch 검색은 특정 인덱스(또는 여러 인덱스)의 _search 엔드포인트를 대상으로 수행됩니다. 기본 검색 요청은 쿼리 매개변수를 정의하는 JSON 본문을 포함하는 POST 요청입니다. 이 본문에서 가장 중요한 부분은 query 객체입니다.

기본 구조:

POST /your_index_name/_search
{
  "query": { ... 여기에 쿼리 구조를 정의합니다 ... },
  "size": 10, 
  "from": 0
}

핵심 쿼리 유형: 정밀도 및 관련성

Query DSL은 다양한 데이터 유형과 매칭 요구 사항에 맞춰진 광범위한 쿼리를 제공합니다. 쿼리 선택은 관련성 점수와 성능 모두에 중요한 영향을 미칩니다.

1. 전체 텍스트 검색: match 쿼리

match 쿼리는 분석된 필드에서 전체 텍스트 검색을 위한 표준입니다. 검색어를 토큰화하고 지정된 필드에서 일치하는 토큰을 확인합니다.

사용 사례: 관련성 점수가 중요한 자연어 텍스트를 검색할 때.

예시: 'description' 필드에 'cloud' 또는 'computing' 단어가 포함된 문서를 찾는 경우.

GET /products/_search
{
  "query": {
    "match": {
      "description": "cloud computing"
    }
  }
}

2. 정확한 값 일치: term 쿼리

term 쿼리는 지정된 정확한 용어를 포함하는 문서를 검색합니다. match와 달리 검색 문자열에 대해 분석을 수행하지 않으므로, 키워드, ID 또는 숫자 색인 필드에 대한 정확한 일치에 이상적입니다.

사용 사례: 분석되지 않은 필드(예: keyword 필드 또는 숫자)에서 정확한 값으로 필터링할 때.

예시: 정확한 ID SKU10021을 가진 제품을 검색하는 경우.

GET /products/_search
{
  "query": {
    "term": {
      "product_id": "SKU10021"
    }
  }
}

3. 범위 쿼리

범위 쿼리를 사용하면 필드 값이 지정된 범위(숫자, 날짜 또는 문자열) 내에 있는 문서를 필터링할 수 있습니다.

문법: gt (초과), gte (이상), lt (미만), lte (이하)를 사용합니다.

예시: 2024년 1월 1일 이후에 접수된 주문을 찾는 경우.

GET /orders/_search
{
  "query": {
    "range": {
      "order_date": {
        "gte": "2024-01-01",
        "lt": "2025-01-01"
      }
    }
  }
}

4. 존재 여부로 필터링: exists 쿼리

exists 쿼리는 특정 필드가 존재하는(즉, null이거나 누락되지 않은) 문서를 식별합니다.

예시: 이메일 주소를 제공한 모든 사용자를 찾는 경우.

GET /users/_search
{
  "query": {
    "exists": {
      "field": "email_address"
    }
  }
}

bool 쿼리를 사용한 복잡한 로직 구성

거의 모든 실제 검색 애플리케이션에서는 여러 기준을 결합해야 합니다. bool 쿼리는 이러한 목적을 위한 필수 도구이며, 부울 논리를 사용하여 다른 쿼리 절을 결합할 수 있습니다.

bool 내 절(Clauses)

bool 쿼리는 네 가지 주요 절을 허용합니다.

  1. must: 이 배열 내의 모든 절은 반드시 일치해야 합니다. must의 절은 관련성 점수에 기여합니다.
  2. filter: 이 배열 내의 모든 절은 반드시 일치해야 하지만, 점수 계산에 영향을 주지 않는(non-scoring) 컨텍스트에서 실행됩니다. 이는 엄격한 포함/제외 기준에 훨씬 더 빠릅니다.
  3. should: 이 배열 내의 적어도 하나의 절은 일치해야 합니다. 이 절들은 관련성 점수에 영향을 주지만, 일치 여부는 선택 사항입니다.
  4. must_not: 이 배열 내의 어떤 절도 일치해서는 안 됩니다 (논리적 NOT과 동일).

실용적인 bool 쿼리 예제

여러 개념을 결합하여 'security'를 언급하지만 초안을 제외하고 'US' 지역에서 사용 가능한 고우선순위 문서를 찾아봅시다.

GET /logs/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "content": "security breach"
          }
        }
      ],
      "filter": [
        {
          "term": {
            "region.keyword": "US"
          }
        }
      ],
      "should": [
        {
          "term": {
            "priority": 5
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "status.keyword": "DRAFT"
          }
        }
      ]
    }
  }
}

예제 설명:

  • Must: 문서의 분석된 content 필드에 "security breach" 구문이 반드시 포함되어야 합니다.
  • Filter: 문서는 'US' 지역으로 태그되어야 합니다 (빠르고 정확한 일치).
  • Should: priority: 5에 일치하는 문서는 관련성 점수에서 가산점을 받지만, mustfilter 절을 충족하는 낮은 우선순위의 문서도 여전히 반환됩니다.
  • Must Not: 'DRAFT'로 표시된 문서는 엄격하게 제외됩니다.

쿼리 구성 모범 사례

검색의 정확성과 성능을 모두 보장하려면 다음 지침을 준수하십시오.

  • 점수 계산과 무관한 기준에는 must 대신 filter를 선호하십시오. 포함/제외 여부만 확인하는 경우(예: ID, 정확한 날짜 또는 상태로 필터링), 항상 bool 쿼리 내에서 filter 절을 사용하십시오. 이는 캐싱을 활용하고 비용이 많이 드는 점수 계산을 방지합니다.
  • 정확한 쿼리를 현명하게 사용하십시오: text로 매핑된 필드(분석된 필드)에는 match를 사용하십시오. keyword로 매핑된 필드(분석되지 않은 필드)에는 term 또는 범위 쿼리를 사용하십시오.
  • 깊은 중첩을 피하십시오: 가능하긴 하지만, 깊게 중첩된 bool 쿼리는 읽고 디버그하기 어려워질 수 있으며, 때로는 성능 저하로 이어질 수 있습니다.
  • minimum_should_match를 활용하십시오: should 절의 경우, minimum_should_match를 설정(예: 1 또는 2로)하면 해당 선택적 기준 중 일정 수가 반드시 충족되도록 강제하여, 점수 계산에 기여하면서도 사실상 필수 기준으로 만듭니다.

Query DSL을 마스터한다는 것은 적절한 도구를 적절한 작업에 맞게 사용하는 방법을 배우는 것을 의미합니다. 즉, 문맥이 중요할 때는 match의 분석적 기능을 사용하고, 정확성이 요구될 때는 termfilter의 정밀성과 속도를 활용하는 것입니다. 이러한 기본적인 쿼리 유형을 적용하고 bool 쿼리의 조합 능력을 활용함으로써, Elasticsearch에서 매우 효과적이고 효율적인 데이터 검색 전략을 구축할 수 있습니다.