[Elasticsearch] 검색과 쿼리(Query DSL)

임유진·2025년 7월 21일

클라우드/인프라

목록 보기
6/25
post-thumbnail

Query DSL 개요

  • Query DSL (Domain Specific Language)는 Elasticsearch에서 검색을 수행하는 데 사용하는 JSON 기반 언어

  • URI 쿼리 파라미터 방식(?q=user:kim)보다 더 강력하고 복잡한 검색 조건을 구성할 수 있음

  • 컨텍스트 종류

    컨텍스트설명
    query_score를 계산하여 결과를 정렬함 (자유 텍스트 검색에 사용)
    filterscore 계산 없이 조건 매칭만 수행. 빠르고 캐시 가능함

1. Full Text Query (분석 기반 검색)

: 색인 시 사용한 analyzer를 기준으로 분석된 텍스트를 검색

주요 쿼리 유형

  • match: 분석된 토큰 단위로 OR 검색
  • match_phrase: 단어 순서 포함한 문장 검색
  • query_string: Lucene 문법 기반 고급 검색
  • match_all: 모든 문서 검색
  • quick OR fox에 매칭된 문서 반환
GET /books/_search
{
  "query": {
    "match": {
      "description": "quick fox"
    }
  }
}
  • 단어 순서 유지, 하나 정도 단어 차이 허용
"match_phrase": {
  "description": {
    "query": "quick brown fox",
    "slop": 1
  }
}

2. Bool 복합 쿼리

: 여러 쿼리 조건을 논리적으로 조합

구성 요소

키워드설명
must반드시 만족해야 함 (AND)
must_not제외할 조건 (NOT)
should하나 이상 만족 시 점수 증가 (OR)
filter점수 계산 없이 필터링 (성능 좋음)
GET /books/_search
{
  "query": {
    "bool": {
      "must": [ { "match": { "title": "quick" } } ],
      "must_not": [ { "match": { "title": "lazy" } } ],
      "filter": [ { "term": { "status": "published" } } ],
      "should": [ { "match_phrase": { "title": "quick fox" } } ]
    }
  }
}

3. Relevancy (_score)

  • 검색 결과는 TF-IDF, BM25 등 알고리즘 기반으로 _score를 부여해 정렬됨
  • _score가 높을수록 더 연관성이 높은 문서
  • 검색 결과에 _score 계산 방식 설명 포함
"explain": true

4. Should 활용 전략

  • must + should 조합으로 결과를 정렬 기준으로 최적화 가능
  • 사용 예: 쇼핑몰 상품 검색에서 필수 조건 외에도 인기 키워드 포함 시 상위 노출
  • category가 electronics인 문서 중 Samsung/LG 포함 문서의 _score가 더 높음
"bool": {
  "must": [ { "match": { "category": "electronics" } } ],
  "should": [
    { "match": { "name": "Samsung" } },
    { "match": { "name": "LG" } }
  ]
}

5. Exact Value Query (정확 값 일치 쿼리)

: 분석되지 않은 데이터(예: 상태, ID 등)를 정확히 일치시켜 검색
  • _score 계산 없음 → filter 컨텍스트에 적합
  • 분석되지 않은 원본 값에 정확히 매칭되기 위해 사용
"filter": {
  "term": {
    "status.keyword": "published"
  }
}
"range": {
  "age": { "gte": 30, "lt": 40 }
}

6. Range Query (범위 쿼리)

: 날짜, 숫자 필드에 범위 조건을 적용

"range": {
  "created_at": {
    "gte": "2023-01-01",   // greater than or equal
    "lt": "2023-12-31"    // less than or equal
  }
}
"range": {
  "price": {
    "gte": 10000,
    "lte": 50000
  }
}
  • 점수 기반 거리 처리
  • function_score`와 조합 시, 특정 값에서 가까울수록 높은 점수 부여 가능
  • price가 2만 원에 가까울수록 score가 높아지도록 처리
    "function_score": {
    "query": {
    "match": { "category": "electronics" }
    },
    "functions": [
    {
    "gauss": {
    "price": {
    "origin": "20000",
    "scale": "10000"
    }
    }
    }
    ]
    }

요약 테이블

분류목적 및 특징
Full Text Query분석된 텍스트 기반 자유 검색 (match, phrase)
Bool Query논리 조합 (must, should, filter, must_not)
RelevancyTF-IDF/BM25 점수 기반 정렬
Should 조합일부 조건 포함 시 score 증가로 우선 정렬
Exact Value Query정확 값 필터링 (ID, 상태 등)
Range Query숫자/날짜 범위 매칭, _score 미반영

참고

profile
말하는 고구마

0개의 댓글