본문 바로가기

Dev. Back-End/Big Data

[Elasticsearch] Query DSL 요약 정리 및 검색(search)방법

 

 


 

 

● Term

term 색인이 나눠지면서 형태소로 나누어지는 저장되는 토큰등을 term이라고 합니다

term 쿼리는 주어진 질의문과 저장된 텀과 정확히 일치하는 문장을 찾습니다.
모든 대문자는 소문자로 변형되고, 중복된 단어는 삭제됩니다.

{
  "query": {
    "term": {
      "url": "/manage/newpost"
    }
  }
}

 

 

 

  Terms

2개 이상의 term을 같이 검색하려면 terms 쿼리를 이용합니다.
필드의 값은 항상 배열로 전달해야 합니다.

 

{
  "query": {
    "terms": {
      "url": ["/manage/newpost", "/manage/view", "/blog/create"],
      "minium_should_match": 2
    }
  }
}

 

* minium_should_match: 몇 개 이상의 term과 일치해야 검색 결과에 시킬지 설정

즉, 위에서는 3개중 2개이상만 일치하면 검색결과 노출되도록 하였습니다.

 

 

 

range

 

range 쿼리는 range : { <필드명>: { <파라메터>:<값> } } 으로 입력됩니다.

range 쿼리 파라메터는 아래의 4가지가 있습니다.

* gte (Greater-than or equal to) - 이상 (같거나 큼)
* gt (Greater-than) – 초과 (큼)
* lte (Less-than or equal to) - 이하 (같거나 작음)
* lt (Less-than) - 미만 (작음)

 

다음은 age필드 값이 15이상, 31미만인 데이터를 검색하는 쿼리입니다.

 

age 값이 15 이상 31 미만인 데이터 검색

{
  "query": {
    "range": {
      "age": {
        "gte": 15,
        "lt": 31
      }
    }
  }
}

 

 match

 

match 쿼리도 term 쿼리와 마찬가지로 주어진 질의문을 색인된 term 비교해서 일치하는 도큐먼트를검색하는 질의다만 term 쿼리와 다르게 match 쿼리에서는 주어진 질의문 또한 형태소 분석을 거친 분석된 질의문으로 검색을 수행합니다예를 들면 The And 검색하면 매치 쿼리는  질의문을 형태소 분석을 거쳐서 the and 질의문을 바꾸고  값을 term 비교해서 검색합니다.

그리고 기본적으로 match 들어가는 데이터들은 or 검색으로 진행됩니다

다시말하면 아래의 예에서는 Seoul 또는 Gangnam 또는 Nonhyeon라는 term으로 검색합니다.

이것을 and 바꾸고 싶은 경우에는 "operator" : "and" 옵션을 넣어주어야 합니다.

{
  "query": {
    "match": {
      "address": "Seoul Gangnam Nonhyeon"
    }    
  }
}
 
 
operator 적용
{
  "query": {
    "match": {
      "address": {
       "address": "Seoul Gangnam Nonhyeon"
        "operator" : "and"
      }
    }    
  }
}

 

 

 

match_phrase

구문 전체와 일치하는 도큐먼트를 검색합니다.

{
  "query": {
    "match_phrase": {
      "title": "Hello elasticsearch"
    }
  }
}

 

 

 

 multi_match

여러 필드에 대한 조건을 검색할 price age 필드에서 값을 조회합니다.

{
  "query": {
    "multi_match": {
      "fields": ["price", "age"],
      "query": 30
    }
  }
}

 

 query_string

URL 검색에서 query 매개변수에 다양한 질의문을 사용해서 검색을 수행했던 방식과 동일하게 사용할수 있는 방식입니다.
여러 필드의 조건으로 검색 가능합니다.

 

{
  "query": {
    "query_string": {
      "default_field": "address",
      "query": "Seoul Gangnam"
    }
  }
}

 

 

 

Bool Query

조건문인  조합으로 적용해서 최종 검색 결과를 찾아낼 수 있습니다.
bool 조건에는 must, must_not, should가 존재합니다.

* must : 반드시 매칭되는 조건, score에 영향을 준다.
* filter : must와 동일한 동작하지만, score에 영향을 주지 않는다.
* should : bool 쿼리가 query context에 있고 must 또는 filter 절이 있다면, should 쿼리와 일치하는 결과가 없더라도 매치가 된다. bool 쿼리가 filter context 안에 있거나, must 또는 filter 중에 하나라도 있는 경우에만 매칭된다. minimum_should_match 이 값을 지정해서 컨트롤할 수 있다.
* must_not : 이 쿼리와 매칭되지 않아야 한다

 

{
"query": {
    "bool": {
        "should": [
            {
                "wildcard": {
                    "adress": "*Seoul*"
                }
            },
            {
                "match": {
                    "adress": "Seoul"
                }
            }
        ],
        "must": {
            "match": {
                "age": 22
            }
        },
        "filter": {
            "range": {
                "time": {
                    "gte": "2020-12-10 00:00:00",
                    "lte": "2020-12-11 23:59:59",
                    "format": "yyyy-MM-dd HH:mm:ss"
                }
            }
        }
    }
}

 

 

 

 

Ref : jonnung.dev/elasticsearch/2018/05/08/elasticsearch-search-api-query-dsl-summary/

wedul.site/493