본문 바로가기

공부방/Elasticsearch

복합 쿼리 - Bool Query

Bool query란?


여러개의 Query를 같이 쓰려면 Bool Query를 사용해야합니다.

Bool Query 안에 여러개의 Query를 넣으면 되는 것입니다.

 

표준 SQL 과 Elasticsearch Bool 쿼리 비교 표준 SQL 과 Elasticsearch Bool 쿼리 비교

 

 

 

 

RDBMS는 and, or 을 사용해서 복합 쿼리를 사용할 수 있다면

Elasticsearch 에서는 must, must not, should, filter를 사용할 수 있습니다.

 

  • must : 쿼리가 참인 도큐먼트들을 검색합니다.
  • must_not : 쿼리가 거짓인 도큐먼트들을 검색합니다.
  • should : 검색 결과 중 이 쿼리에 해당하는 도큐먼트의 점수를 높입니다.
  • filter : 쿼리가 참인 도큐먼트를 검색하지만 스코어를 계산하지 않습니다.
    • must 보다 검색 속도가 빠르고 캐싱이 가능합니다.

 

Bool query 사용 예제


기본 사용법은 아래와 같습니다.

 

GET <인덱스명>/_search
{
  "query": {
    "bool": {
      "must": [
        { <쿼리> }, …
      ],
      "must_not": [
        { <쿼리> }, …
      ],
      "should": [
        { <쿼리> }, …
      ],
      "filter": [
        { <쿼리> }, …
      ]
    }
  }
}

 

must query 사용 예제


다음은 단어 "quick"과 구문 "lazy dog"가 포함된 모든 문서를 검색하는 쿼리입니다.

 

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {"message": "quick"}
        },
        {
          "match_phrase": {"message": "lazy dog"}
        }
      ]
    }
  }
}

 

must not query 사용 예제


다음은 단어 "quick" 그리고 구문 "lazy dog"가 하나도 포함되지 않은 문서를 검색합니다.

 

GET my_index/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {"message": "quick"}
        },
        {
          "match_phrase": {"message": "lazy dog"}
        }
      ]
    }
  }
}

 

Should query 사용 예제


should의 사용법을 살펴봅시다.

먼저 message가 fox인 데이터를 찾아봅시다.

4개의 결과를 return 받을 수 있습니다.

 

 

GET my_index/_search
{
	"query" : {
    	"match" : {
        	"message" : "fox"
        }
    }
}

 

아래 should 명령어를 같이 사용해 봅시다.

lazy가 들어가 있는 데이터는 점수를 더 높게 설정해줘서 order를 변경해줄 수 있습니다.

 

GET my_index/_search
{
	"query" : {
    	"bool" : {
        	"must" : [
            	{
                	"match" : {"message" : "fox"}
                }
            ], 
            "should" : [
            	{
                	"match": {"message" : "lazy"}
                }
            ]
        }
    }
}