본문 바로가기
Programming/Elasticsearch

[Elasticsearch] Query DSL 주요 쿼리 정리

by 가론노미 2023. 5. 5.

Query DSL이란?

  • Elasticsearch에서 쿼리 실행에 사용할 수 있도록 JSON 스타일의 도메인 전용 언어
  • Query context
    • 전문 검색 시 사용 - 분석기에 의해 분석이 수행되고 연관성 관련 score를 계산
    • ex) "Harry Portter" 같은 문장 분석
  • Filter Context
    • 조건 검색 시 사용 - Yes/No로 단순 판별만 가능하며 연관성 관련 score 계산을 하지 않음
    • ex) "create_year" 필드의 값이 2023년인지 여부

Query DSL의 주요 쿼리

Match all query

: 모든 문서를 검색하는 쿼리

{
  "query": {
    "match_all": {}
  }
}

Match query

: 텍스트, 숫자, 날짜 등이 포함된 문장을 형태소 분석을 통해 term으로 분리한 후 이 term들을 이용해 검색 질의를 수행

{
  "query": {
    "match": {
      "message": {
        "query": "this is a test"
      }
    }
  }
}

Multi-match query

: Match query와 기본적인 사용 방법은 동일하나 단일 필드가 아닌 여러 개의 필드를 대상으로 검색해야 할 때 사용

{
  "query": {
    "multi_match" : {
      "query" : "this is a test",
      "fields" : [ "subject^3", "message" ] 
    }
  }
}

Types

  • best_fields (default)
    • 모든 필드에 대해 스코어를 계산한 뒤, 가장 잘 match 되는 1개의 필드를 기준으로 스코어를 계산
    • 나머지 필드에 대해서는 tie_breaker가 설정되었을 경우 tie_breaker * score를 해서 더함
    → best_fields type query 시 tie_breaker를 1로 설정한 score와 most_fields type query 시 tie_breaker 설정하지 않았을 때의 score는 동일하다
  • most_fields
    • 모든 필드에 대해 match 되는 각각의 필드에 대해 점수를 계산하고 합한 뒤 필드 개수로 나누어서 최종 스코어 계산
  • phrase
    • 모든 필드에 대해 Match phrase query 실행 후 가장 잘 match 되는 1개의 필드를 기준으로 스코어를 계산
  • phrase_prefix
    • 모든 필드에 대해 Match phrase prefix query 실행 후 가장 잘 match 되는 1개의 필드를 기준으로 스코어를 계산
  • bool_prefix
    • 모든 필드에 대해 Match bool prefix query 실행 후 가장 잘 match 되는 1개의 필드를 기준으로 스코어를 계산
  • cross_fields
    • 여러 필드가 일치해야 하는 구조화된 문서에 유용
    • 필드를 기준으로 계산하지 않고 term을 기준으로 모든 필드를 하나의 필드로 합친 뒤 match 되는지 확인하여 스코어 계산
    • 즉 문서가 일치하려면 검색 키워드의 모든 term이 하나 이상의 필드에 있어야 함

Term query

: Match query와 다르게 별도의 분석 작업을 수행하지 않고 입력된 텍스트가 존재하는 문서를 찾는다.

  • keyword 데이터 타입을 사용하는 필드를 검색하려면 Term query를 사용해야 함
  • Term query는 검색어를 하나의 term으로 처리하기 때문에 필드에 term이 정확히 존재하지 않는 경우 검색이 되지 않음
    • id, price와 같은 정확한 값을 기반으로 검색하려고 할 때 사용
{
  "query": {
    "term": {
      "user.id": {
        "value": "kimchy",
        "boost": 1.0
      }
    }
  }
}

Prefix query

prefix란? 접두사 라고 하며, 어떤 단어의 앞에 붙어 뜻을 첨가하여 하나의 다른 단어를 이루는 말을 이른다.
ex) ‘맨주먹·덧버선·풋사과·군소리’ 등에서 ‘맨―’·‘덧―', '풋-', '군-'

: 해당 접두사가 있는 모든 문서를 검색하는 데 사용한다.

{
  "query": {
    "prefix": {
      "user.id": {
        "value": "ki"
      }
    }
  }
}

Match phrase query

phrase란? 둘 또는 그 이상의 어절로 이루어져 한 덩어리로써 절이나 문장의 성분이 되는 동일한 말의 단위

: Match query와 동일하게 분석 작업을 수행하는 것은 동일하나, 분석한 토큰이 모두 존재하고 순서도 순차적으로 동일한 document만을 검색한다.

  • Match query는 token들 중에 일치하는 키워드가 하나라도 존재하면 document에 포함한다는 점에서 차이가 있다.

Match phrase prefix query

: match_phrase query처럼 분석 작업을 수행한 term들이 모두 존재하고 순차적으로 동일한 document를 검색한다.

match_phrase query와의 차이점은 마지막 term은 prefix query로 검색을 수행한다는 점이다.

{
  "query": {
    "match_phrase_prefix": {
      "message": {
        "query": "quick brown f"
      }
    }
  }
}

"quick brown fox"와 "two quick brown ferrets"는 검색이 되고, "the fox is quick and brown"은 검색되지 않는다.

Match bool prefix query

: 분석 작업을 수행한 후 term들을 가지고 bool query를 실행하며, bool query 내에서는 마지막 term을 제외한 각 term들은 term query로 적용되고 마지막 term에 한해서만 prefix query가 적용된다.

{
  "query": {
    "match_bool_prefix" : {
      "message" : "quick brown f"
    }
  }
}

Match bool prefix query를 아래와 같이 표현할 수 있다.

{
  "query": {
    "bool" : {
      "should": [
        { "term": { "message": "quick" }},
        { "term": { "message": "brown" }},
        { "prefix": { "message": "f"}}
      ]
    }
  }
}

match_phrase_prefix query와의 차이점은 match_phrase_prefix query는 분석한 term들을 구문으로 일치시키지만

match_bool_prefix query는 어떤 위치이든 term이 존재한다면 일치된다는 점이다.

 

"quick brown f"라는 문장을 가지고 각각의 쿼리를 실행했을 때,

match_bool_prefix query는 "quick brown fox"도 검색되고, "brown fox quick"도 검색 가능하다.

match_phrase_prefix query는 "quick brown fox"는 검색되지만, term들의 순서가 다른 "brown fox quick"는 검색되지 않는다.

Bool query

: 하나의 쿼리나 여러 개의 쿼리를 조합해서 검색할 수 있다.

  • AND, OR, NAND, FILTER를 must, must_not, should, filter로 표현
{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "user.id" : "kimchy" }
      },
      "filter": {
        "term" : { "tags" : "production" }
      },
      "must_not" : {
        "range" : {
          "age" : { "gte" : 10, "lte" : 20 }
        }
      },
      "should" : [
        { "term" : { "tags" : "env1" } },
        { "term" : { "tags" : "deployed" } }
      ],
      "minimum_should_match" : 1,
      "boost" : 1.0
    }
  }
}

이외에도 많은 Query들에 대한 내용을 elastic document에서 확인할 수 있다.

 

Query DSL | Elasticsearch Guide [8.7] | Elastic

Elasticsearch provides a full Query DSL (Domain Specific Language) based on JSON to define queries. Think of the Query DSL as an AST (Abstract Syntax Tree) of queries, consisting of two types of clauses: Leaf query clauses Leaf query clauses look for a par

www.elastic.co

 

<참고>