본문 바로가기
infra/ELK

[ELK] Elasticsearch의 데이터 검색 - Query DSL

by hjhello423 2020. 1. 19.

Query DSL(Query Domain Specific Language)은 ES의 document를 검색할 때 사용합니다.

Query DSL에 대해 간단하게 정리해 보도록 하겠습니다.

 

중간 내용부터 document를 docs로 줄여서 표기하였습니다.

 


Query and filter Context

ES는 검색 결과에 관련성 점수(relevance score)를 매기고 점수별로 정렬하여 각 document가 쿼리와 얼마나 일치하는지 측정하게 됩니다.

이 관련성 점수는 _score meta-field에 반환되며 양의 부동 소수점 숫자값을 가집니다. 이 숫자가 높을수록 높은 관련성을 가지게 됩니다.

Query context

Query context에서 쿼리 절은 '이 document가 이 쿼리 절과 얼마나 일치하는가?'에 대한 질의에 답하게 됩니다.

쿼리 절은 document의 일치 여부와 _score 필드의 점수를 계산합니다.

filter context와 달리 캐싱되지 않습니다.

Filter context

Filter context의 쿼리 절은 '이 document가 쿼리 절과 일치합니까?'에 대한 질의에 답하게 됩니다.

응답은 질의에 대한 yes/no이며 점수는 계산되지 않습니다.

ES는 자주 사용되는 filter를 자동으로 캐싱하고 성능을 향상합니다.

ex)

  • Does this timestamp fall into the range 2015 to 2016?
  • Is the status field set to "published"?

Query, filter context 예시

다음은 search API에서 사용되는 쿼리 절의 예시입니다.

  • title필드에는 'Search'가 포함되어 있다. (search)
  • content필드에는 'Elasticsearch'가 포함되어 있다. (elasticsearch)
  • status필드에는 'pyblished' 단어가 정확히 포함되어 있다. (published)
  • publish_date필드에는 2015-01-01 이후의 날짜가 포함된다.

1. 이 query매개 변수는 query context를 나타냅니다.

2. bool 및 두 개의 match 절은 query contex에서 사용되며 각 document가 얼마나 잘 일치하는지 점수를 매기는 데 사용됩니다.

3. filter매개 변수는 filter context를 나타냅니다. term과 range 절은 filter context에서 사용되며. 일치하지 않는 document는 필터링하지만 일치하는 점수에는 영향을 미치지 않습니다.

 


Boolean Query (링크)

true/false를 사용하는 쿼리입니다.

  • must: 일치하는 document에 나타나야 하며 점수에 기여합니다.
  • filter: 일치하는 document에 나타나야 합니다. 점수는 무시됩니다. filter context에서 실행됩니다. 즉, 스코어링이 무시되고 캐싱에 고려됩니다.
  • should: 일치하는 문서에 나타나야 합니다.
  • must_not: 일치하는 document에 나타나지 않아야 합니다. filter context에서 실행됩니다. 점수가 무시되므로 모든 document에 대한 점수 0이 반환됩니다.

다음은 age:22이지만 status:KS가 아닌 doc를 검색합니다.

curl -X GET "localhost:9200/bank/account/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "22" } }
      ],
      "must_not": [
        { "match": { "state": "KS" } }
      ]
    }
  }
}
'

 


Boosting Query (링크)

부정 쿼리와 일치하는 docs의 관련성 점수를 줄이면서 긍정적 쿼리와 일치하는 docs를 반환합니다.

boosting query를 사용하여 특정 docs검색 결과에서 제외하지 않고 강등시킬 수 있습니다.

  • positive: (Required, query object) 실행할 쿼리입니다. 반환된 모든 docs는 이 쿼리와 일치해야 합니다.
  • negative: (Required, query object) 일치하는 문서의 관련성 점수를 낮추는 데 사용되는 쿼리입니다.
  • negative_boost: (Required, float) 0과 1.0 사이의 부동 소수점 숫자는 음수 쿼리와 일치하는 문서의 관련성 점수를 낮추는 데 사용됩니다.

 


Term Query (링크)

 

제공된 필드에 정확한 용어 가 포함된 문서를 반환합니다.

term쿼리를 사용하여 가격, 제품 ID 또는 사용자 이름과 같은 정확한 값을 기준으로 문서를 찾을 수 있습니다.

GET /_search
{
    "query": {
        "term": {
            "user": {
                "value": "Kimchy",
                "boost": 1.0
            }
        }
    }
}

 

term query를 text 필드 검색에 사용하면 올바른 결과를 얻을 수 없습니다.

문자열을 ES에 insert 했다면 ES에서는 standard analyzer에서 토큰이라 불리는 개별 단어로 분리합니다.

만약 'Quick Brown Foxes!'라는 text를 insert 하면 [quick, brown, fox]으로 분리 및 변경합니다.

text를 검색하고자 하면 아래와 같이 match를 이용하면 됩니다.

GET my_index/_search?pretty
{
  "query": {
    "match": {
      "full_text": "Quick Brown Foxes!"
    }
  }
}

 


참조

 

반응형

댓글