본문 바로가기

엘라스틱 서치

엘라스틱서치 검색 Query DSL

0. 개요

엘라스틱서치는 검색을 위한 다양한 방법을 제공합니다.

그 중에서, 검색을 위한 쿼리 방법를 제공하는데 이를 Query DSL이라 합니다.

엘라스틱서치의 Query DSL은 모두 JSON 방식을 사용합니다.

이 글에서 사용하는 데이터는 아래와 같습니다.

POST ksb/_bulk
{"index":{"_id":1}}
{"message":"ksb kkk", "age":20}
{"index":{"_id":2}}
{"message":"ksb sss kkk", "age":40}
{"index":{"_id":3}}
{"message":"ksb bbb sss kkk", "age":10}
{"index":{"_id":4}}
{"message":"test sss", "age":100}
{"index":{"_id":5}}
{"message":"test bbb sss", "age":30}

 

1. 풀 텍스트 쿼리(Full Text Query)

1.1 match_all

math_all은 조건 없이 모든 index의 document를 검색하는 방법입니다. 검색시에 쿼리를 넣지 않으면 해당 방법으로 동작합니다.

GET ksb/_search

 

1.2 match

가장 많이 사용되는 방법입니다.

쿼리와 일치하는 document를 반환합니다.

GET ksb/_search
{
  "query": {
    "match": {
      "message": "sss"
    }
  }
}

여러 검색어를 넣을 수 있는데, OR 연산으로 동작합니다.

GET ksb/_search
{
  "query": {
    "match": {
      "message": "sss ksb"
    }
  }
}

AND 연산을 하고 싶으면, operator를 사용하면 됩니다.

GET ksb/_search
{
  "query": {
    "match": {
      "message": {
        "query": "sss ksb",
        "operator": "and"
      }
    }
  }
}

 

1.3 math_phrase

공백을 포함해 입력된 순서를 지키는 document를 검색하고 싶을 때 사용합니다.

GET ksb/_search
{
  "query": {
    "match": {
      "match_phrase": {
        "query": "ksb sss"
      }
    }
  }
}

만약 단어들이 일정 공간 이내로 떨어져있을 때 slot을 사용하면 해당 조건을 검색할 수 있습니다.

GET ksb/_search
{
  "query": {
    "match": {
      "match_phrase": {
        "query": "ksb sss",
        "slot" : 1
      }
    }
  }
}

💡 slot이 크면 검색 범위가 넓어져 관련 없는 document가 검색될 수 있습니다. slot은 1 이하로만 사용하는걸 추천합니다.

 

1.4 query_string

엘라스틱서치는 루씬을 바탕으로 만들어졌습니다.

URL 검색에 사용되는 루씬의 검색 문법을 엘라스틱서치에 사용하고 싶을 때, query_string을 사용합니다.

GET ksb/_search
{
  "query": {
    "query_string": {
      "default_field": "message",
      "query": "(ksb AND bbb) OR \\"bbb sss\\""
    }
  }
}

 

2. Bool 복합 쿼리(Bool Query)

상위에 bool 쿼리를 넣고, 내부에 쿼리를 넣으면 쿼리를 조합할 수 있습니다.

bool 쿼리에 네 가지가 있습니다.

  1. must : 쿼리가 인 document를 검색합니다.
  2. must_not : 쿼리가 거짓인 document를 검색합니다.
  3. should : 일치하는 쿼리의 document 점수를 높입니다.
  4. filter : 참인 document를 검색하지만, 점수를 계산하지 않습니다. must 보다 빠르고, 캐싱이 가능합니다.

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

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

 

2.1 must

GET ksb/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "ksb"
          }
        },
        {
          "match_phrase": {
            "message": "sss bbb"
          }
        }
      ]
    }
  }
}

 

2.2 must_not

GET ksb/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "message": "ksb"
          }
        },
        {
          "match_phrase": {
            "message": "bbb sss"
          }
        }
      ]
    }
  }
}

 

2.3 should

GET ksb/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "sss"
          }
        }
      ],
      "should": [
        {
          "match": {
            "message": "ksb"
          }
        }
      ]
    }
  }
}

 

2.4 filter

filter는 검색에 조건은 추가하지만 스코어에는 영향을 주지 않도록 제어할 때 사용합니다.

보통 쇼핑몰에서 검색어로 정확도가 높은 상품명을 검색하면서 생산 업체를 다시 필터링 하는 등의 용도로 사용이 가능합니다.

GET ksb/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "sss"
          }
        }
      ],
      "filter": [
        {
          "match": {
            "message": "ksb"
          }
        }
      ]
    }
  }
}

 

3. 범위 쿼리(Range Query)

범위를 제한 때 사용되는 파라메터는 네 가지가 있습니다.

  1. gte(Grater-Then or Equal-to) : 이상
  2. gt(Grater-Then) : 초과
  3. lte(Less-Then or Equal-to) : 이하
  4. lt(Less-Then) : 미만

 

3.1 gte, lte

GET ksb/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 20,
        "lte": 100
      }
    }
  }
}

 

3.2 gt, lt

GET ksb/_search
{
  "query": {
    "range": {
      "age": {
        "gt": 20,
        "lt": 100
      }
    }
  }
}

 

4. 마무리

엘라스틱서치의 아주 기본적인 검색을 실습했습니다.

어렵거나 복잡한 내용을 제외하려다 보니 많은 내용이 빠질 수 밖에 없었는데, 자세한 내용을 알고 싶은 문은 이 글을 작성할 때 참고한 아래 링크를 통해 확인하시기 바랍니다.

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

 

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

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

esbook.kimjmin.net