본문 바로가기

ElasticSearch

elsatic search QueryDSL 정리

이번 포스트는 elastic search 를 활용하여 api 검색할때 사용되는 query를 정리해보겠습니다. 해당 쿼리를 api body 부분에 넣어서 사용 할 수 있습니다.

 

1. match_all 

이 query는 해당 index의 모든 데이터를 가져 옵니다.

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

 

2. match

  • match는 특정 필드에 입력한 검색값이 포함된 데이터를 검색합니다.
  • 띄어쓰기로 구분되는 term중 하나라도 겹치는 데이터를 출력합니다.
  • 아래의 경우 title필드에 "엘라스틱"이나 "서치"가 포함된 데이터를 출력합니다.

 

{
  "query":{
    "match":{
      "title":"엘라스틱 서치"
    }
  }
}

 

3. term

  • 특정 필드에 검색값과 정확히 일치하는 데이터를 검색합니다
  • title이 "엘라스틱 서치"인 경우만 반환하고 "엘라스틱 서치 소개"등 과 같은 데이터는 검색되지 않습니다.
{
  "query":{
    "term":{
      "title":"엘라스틱 서치"
    }
  }
}

 

4. match_phase

  • 필드에 검색어로 입력한 구문이 포함되어 있는 데이터를 검색합니다.
  • title에서 "엘라스틱 서치 소개"나 "특강 엘라스틱 서치"등이 검색 됩니다. "엘라스틱 텍스트 서치"와 같이 사이에 다른 단어가 들어가면 검색되지 않습니다.
{
  "query":{
    "match_phrase":{
      "title":"엘라스틱 서치"
    }
  }
}

 

5. multi_match

  • 검색어를 여러 필드에서 검색합니다.
  • title과 contents에서 "엘라스틱 서치"가 match 검색된 데이터가 출력됩니다.
  •  
{
  "query":{
    "multi_match":{
      "query":"엘라스틱 서치",
      "fields":["title","contents"]
    }
  }
}

 

6. range

  • 검색 범위를 지정합니다.
  • gt - 초과, gte - 이상, lte - 이하, lt - 미만, from - 시작점, to - 끝점
  • count가 10~20 사이인 데이터를 출력합니다
{
  "query":{
    "range":{
      "count":{
        "gte":10,
        "lte":20
      }
    }
  }
}

 

 

7. bool 복합쿼리

  • 여러 조건의 검색을 진행합니다.
  • must, must_not, should, filter 등의 조건들을 사용할 수 있습니다.
  • 함께 사용될경우 and연산으로 적용됩니다.

7-1. must, must_not 

  • 하위 검색에서 만족하거나(must) 만족하지 않는 데이터를 출력합니다.
  • title에 "엘라스틱 서치"가 포함되고 "contents"에는 "SQL"이 포함되지 않는 데이터를 검색합니다.
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "엘라스틱 서치"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "contents": "SQL"
          }
        }
      ]
    }
  }
}

 

 

7-2 should

  • 조건에 만족하는 데이터에 더 높은 score를 부여합니다. elastic search 에서는 score가 높에 부여된 데이터를 우선적으로 출력합니다.
  • title에 "엘라스틱 서치"가 포함되어있는 데이터를 검색하되. "contents"에 "백엔드"가 포함되어있는 데이터에 더 높은 score를 부여합니다(우선적으로 검색합니다.)
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "엘라스틱 서치"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "contents": "백엔드"
          }
        }
      ]
    }
  }
}

 

 

7-3 filter

  • 검색 결과를 필터링 하는데 사용됩니다.
  • bool 복합 쿼리로 여러 조건으로 검색하는것과 비슷한 결과를 보여주지만 filter에 들어있는 조건은 결과 score에 영향을 주지 않습니다.(filter 내의 쿼리가 검색 우선순위에 영향을 주지 않습니다.)
  • title에 "엘라스틱 서치"가 포함된 데이터 중에 author가 "challee"인 데이터만 출력합니다.
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "엘라스틱 서치"
          }
        }
      ],
      "filter": [
        {
          "bool": {
            {
              "must":[
                {
                  "match":{
                    "author":"challee"
                  }
                }
              ]
            }
            
          }
        }
      ]
    }
  }
}

 

 

이상으로 개발하면서 가장 흔하게 사용되는 elastic search query를 정리해 보았습니다. 이 외에도 다양한 queay가 존재하니 elastic 공식 사이트에서 어떤 것들이 있는지 한번 읽어보는 것을 추천 드립니다.

https://esbook.kimjmin.net/05-search

 

5. 검색과 쿼리 - Query DSL - Elastic 가이드북

인터넷 쇼핑몰에 상품이 100만개가 있을 때 검색창에 "무선 이어폰" 이라고 입력해서 시스템에 있는 전체 100만개의 상품들 중 무선 이어폰과 연관된 상품만 추려내는 과정을 검색이라고 할 수 있

esbook.kimjmin.net