본문 바로가기

Monitoring Tools/ELK Stack

[elasticsearch] Query DSL(Domain Specific Language)

반응형

elasticsearch는 query를 json 형식으로 하는 Query DSL 제공한다. 또한 query절은 query context, filter context에 따라 관련성 점수(Relevance score)가 달라진다.

query context, filter context 관련 참고 :
 - https://ploz.tistory.com/entry/elasticsearch-Query-DSL-%EA%B4%80%EB%A0%A8%EC%84%B1-%EC%A0%90%EC%88%98Relevance-score
 - https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html

 

 

Boolean query


복합쿼리의 기본이 되는 query이며 복합적인 쿼리들을 조합하여 매치하여 높은 score의 결과를 유도 할수 있다. 아래와 같은 유형으로 나누어 query를 작성하고 조합한다.

must 이 쿼리 절의 모든 쿼리가 일치(AND 연산)하는 document를 조회하며 관련성 점수(Relevance score)에 의해 나열된다.
filter must와 같이 일치하는 document를 조회하지만 관련성 점수(Relevance score)는 무시된다.
should 이 쿼리 절의 모든 쿼리중 하나라도 일치(OR 연산)하는 document를 조회한다.
must_not 이 쿼리 절의 모든 쿼리 중 일치하지 않는 document를 조회한다.

 

아래를 예시로 must, must_not, should, filter 절은 서로 AND 연산을 한다.

1. must : asn.AS Name 필드에 "AS" or "EG 값과 일치하는 document를 매칭한다.

2. must_not : asn.AS Name 필드에 "AS" 값과 일치하지 않는 document를 매칭한다.

3. should : asn.AS Name 필드에 "AS"와 일치하는 document나 "EG"와 일차하는 document를 매칭한다.

4. filter : asn.AS Name 필드에 "ASD" 값과 일치하는 keyword document를 매칭한다.

{
  "_source": [
    "ColoCode",
    "cf-origin.azregion",
    "asn.AS Name"
  ],
  "query": {
    "bool": {
      "must": [{ "match": { "asn.AS Name": { "query": "AS-EG" }}}],
      "must_not": [{ "match": { "asn.AS Name": { "query": "AS" }}}],
      "should": [
        { "match": { "asn.AS Name": { "query": "AS" }}},
        { "match": { "asn.AS Name": { "query": "EG" }}}
      ],
      "filter": [{ "term": { "asn.AS Name": { "value": "ASD" }}}]
    }
  },
  "from": 0,
  "size": 2
}
_source : 결과물 출력시 표출할 필드를 선택
from : 게시판의 page개념과 유사
size : 몇개의 document를 출력할 것인지 결정

 

 

 

Full Text Query


Match Query

text, number, date 값과 일치하는 document를 검색하며 전문(full text) 검색을 위한 표준 query이다.

{
  "query": {
    "match": {
      "asn.AS Name": {
        "query": "QWE ASD ZXC"
      }
    }
  }
}

"QWE ASD ZXC" 는 "QWE", "ASD", "ZXC" 세개의 글자로 구분되어 역색인된다.

자세하게는 text 타입은 분석기를 통해 lowercase 처리되어  [qwe,asd,zxc]로 역색인 된다.

단어의 순서를 고려하지 않는 match query의 특성 상 "QWE ASD ZXC"는 결국 QWE or ASD or ZXC 의 조건으로 asn.AS Name 필드를 검색 하게 된다.

match query는 기본적으로 OR 연산을 한다.

 

QWE-ASD 도 [qwe,asd] 로 역색인 된다.
QWE_ASD는 [qwe_asd]로 역색인 된다.


Bool query must 절을 사용하여 여러개의 match 쿼리를 하는 경우 match 쿼리 서로간은 AND 연산을 한다.

아래 예시와 같이 "AS" and ("TE" or "RE") 로 연산 된다.

{
  "query": {
    "bool": {
      "must": [
        { "match": { "asn.AS Name": "AS" }},
        { "match": { "asn.AS Name": "TE-RE" }}
      ]
    }
  }
}

 

operator 옵션을 사용하면 AND 연산을 할 수 있다.

default 값은 or 이다.

아래 예시와 같이 "Tele" and "PE" 로 연산된다.

{
  "query": {
    "match": {
      "asn.AS Name": {
        "query": "Tele PE",
        "operator": "and"

        }
    }
  },
}

 

 

Match_phrase Query

query 구문과 정확히 일치하고 포함하는 document를 검색한다.

아래 예시로 "NEXTNET SAC"와 정확히 일치하고 포함하는 결과를 검색하며, AND 연산을 비롯하여 구문의 순서도 일치하여야 한다. 단, [nextnet,sac] 로 역색인 되기 때문에 "NEXTNET SA"로 검색하면 다른 결과가 나온다. [nextnet,sa]로 역색인 되기 때문이다.

{
  "query": {
    "match_phrase": {
      "asn.AS Name": "NEXTNET SAC"
    }
  }
}

 

 

Match_phrase_prefix Query

query 구문을 접두사로 하는 document를 검색한다.

아래의 예시로 "ENTEL PER"의 구문을 포함하고 일치하는 document를 검색하지만 Match_phrase와 다른점은 [entel,peru]도 매칭된다는 점이다. 즉 peru에 per이 포함되므로 결과에 포함된다.

{
  "query": {
    "match_phrase_prefix": {
      "asn.AS Name": {
        "query": "ENTEL PER",
        "max_expansions": 2
      }
    }
  }
}

mas_expansions : 허용 가능한 접미사의 수로 default 값은 50이다.

 

 

Multi-match Query

query 구문을 다수의 필드에서 매칭하여 ducoment를 검색한다.

아래의 예시로 "HU S" query 구문을 ClientCountry, asn.AS Name 두필드에서 검색하며 이때 ClientCountry, asn.AS Name필드는 OR 연산 하며 "HU S" 또한 OR 연산한다.

{
  "query": {
    "multi_match": {
        "query": "HU S",
        "fields": [ "ClientCountry","asn.AS Name" ]
    }
  }
}

그리고 필드값에 "*.asn.AS Name"와 같은 와일드카드(*)를 사용할수 있다.

 

 

Combined_fields Query

multi_match와 비슷하지만 operator 옵션으로 query 구문을 AND, OR 조건으로 검색 할 수 있으며 7.13버전부터 추가 되었다.

아래의 예시로 "PERU ENTEL" 의 구문을 "PERU" and "ENTEL"의 AND 연산으로 ClientCountry,asn.AS Name 두 필드에서 OR 조건으로 검색을 수행한다.

{
  "query": {
    "combined_fields": {
        "query": "PERU ENTEL",
        "fields": [ "ClientCountry","asn.AS Name" ],
        "operator": "and"
    }
  }
}

 

 

 

Tern Level Query


Term Query

역색인에 정확한 query 구문을 포함한 document를 검색한다.

"QWE ASD" 는 분석기를 거치며 lowercase 처리되어 [qwe,asd]로 역색인된다. term query는 test 필드에 "qwe"로 검색할수 있으며 "QWE"로 검색하면 원하는 결과를 얻을 수 없다.

{
  "query": {
    "term" : { "test" : "qwe" } 
  }
}

 

 

Terms Query

아래의 예시로 test필드에 qwe, asd의 query 구문을 검색하는데 이때 qwe, asd는 OR 연산을 한다.

{
    "query": {
        "terms" : { "test" : ["qwe", "asd"]}
    }
}

 

 

Range Query

아래 표의 parameter로 범위 query를 할수 있다.

gte Greater-than or equal to
gt Greater-than
lte Less-than or equal to
lt Less-than
boost Sets the boost value of the query, defaults to 1.0

아래의 예시로 10보다 크거나 같으며 20보다 작거나 같은 범위를 검색하며 이때 score 는 두배로 계산한다.

{
    "query": {
        "range" : {
            "age" : {
                "gte" : 10,
                "lte" : 20,
                "boost" : 2.0
            }
        }
    }
}

 

복합쿼리를 이용하여 날짜 범위를 적용하여 검색하는 예이다.

time_zone : Asia/Seoul UTC +9

 {
 "_source": [
    "RayID",
    "ClientCountry",
    "CacheCacheStatus",
    "@timestamp"
  ],
  "query": {
    "bool": {
      "must": [{ "match": { "ClientCountry": { "query": "kr" }}}],
      "filter": [ 
        { 
          "range": { 
            "@timestamp": { 
              "time_zone": "+09:00",        
              "gte": "2024-07-29T11:00:00", 
              "lte": "now"   
            }
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 2
}

 

 

Match_all / Match_none Query


Match_all Query

모든 document를 출력한다.

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

 

 

Match_none Query

document를 출력하지 않는다.

{
  "query": {
    "match_none": {}
  },
}

 

반응형