ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 12. Query DSL의 주요 쿼리
    BackEnd/elasticsearch 2021. 10. 2. 16:40
    반응형

    1. Match All Query

      가장 단순한 쿼리로서 일반적으로 색인에 저장된 문서를 확인할 때 사용합니다.

    POST movie_search/_search
    {
      "query": {
        "match_all": {}
      }
    }

     

    2. Match Query

      텍스트, 숫자, 날짜 등이 포함된 문장을 형태소 분석을 통해 텀으로 분리한 후 이 텀들을 이용해 검색 질의를 수행합니다. 검색어가 분석돼야 할 경우에 사용합니다.

    POST movie_search/_search
    {
      "query": {
        "match": {
          "movieNm": "그대 장미" # 형태소 분석을 통해 "그대", "장미" 라는 2개의 텀으로 분리 ( OR 연산 )
        }
      }
    }

     

    3. Multi Match Query

      Match Query와 기본적인 사용 방법은 동일하나 여러 개의 필드를 대상으로 검색해야 할 때 사용합니다.

    # movieNm or movieNmEn 필드에서 "가족"이 포함된 모든 문서를 검색
    POST movie_search/_search
    {
      "query" : {
        "multi_match": {
          "query": "가족",
          "fields": ["movieNm","movieNmEn"]
        }
      }
    }

     

    4. Term Query

      Match Query는 쿼리를 수행하기 전 먼저 분석기를 통해 텍스트를 분석한 후 검색을 수행하지만 Term Query는 별도의 분석 작업을 수행하지 않고 입력된 텍스트가 존재하는 문서를 찾습니다. 따라서 Keyword 데이터 타입을 사용하는 필드를 검색할 때 사용합니다.

      검색어를 하나의 텀으로 처리하기에 필드에 텀이 정확히 존재하지 않는 경우 검색이 되지 않습니다. 영문의 경우, 대소문자가 다를 경우 검색되지 않으므로 주의합니다.

    POST movie_search/_search
    {
      "query" : {
        "term": {
          "genreAlt": "코미디"
        }
      }
    }

     

    5. Bool Query

      엘라스틱서치에서는 하나의 쿼리나 여러 개의 쿼리를 조합해서 더 높은 스코어를 가진 쿼리 조건으로 검색을 수행할 수 있습니다. 이러한 유형의 쿼리를 Compound Query라 하는데, 이러한 Compound 쿼리를 구현하기 위해 Bool Query를 제공합니다.

    {
      "query": {
        "bool": {
          "must": [],
          "must_not": [],
          "should": [],
          "filter": []
        }
      }
    }
    Elasticsearch SQL 설명
    must : [필드] AND 칼럼 = 조건 반드시 조건에 만족하는 문서만 검색
    must_not : [필드] AND 칼럼 != 조건 조건을 만족하지 않는 문서 검색
    should : [필드] OR 칼럼 = 조건 여러 조건 중 하나 이상 만족하는 문서 검색
    filter : [필드] 칼럼 IN ( 조건 ) 조건을 포함하고 있는 문서 출력
    (해당 파라미터를 사용하면 스코어별로 정렬되지는 않는다.)
    # 대표장르가 "코미디"이고 제작 국가에 "한국"이 포함돼 있으며 영화 타입 중 "단편"이 제외된 문서 검색
    POST movie_search/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "repGenreNm": "코미디"
              }
            },
            {
              "match": {
                "repNationNm": "한국"
              }
            }
          ],
          "must_not": [
            {
              "match": {
                "typeNm": "단편"
              }
            }
          ]
        }
      }
    }

     

    6. Query String

      엘라스틱서치에서는 기본적으로 내장된 쿼리 분석기가 있습니다. query_string 파라미터를 사용하는 쿼리를 작성하면 내장된 쿼리 분석기를 이용하는 질의를 작성할 수 있습니다.

    # '가정'과 '어린이날'이 각각 형태소 분석기를 통해 분석 후 AND 조건과 만족하는 문서 검색
    POST movie_search/_search
    {
      "query" : {
        "query_string": {
          "default_field": "movieNm",
          "query": "(가정) AND (어린이 날)"
        }
      }
    }

    (주의) 기존 텀 쿼리와 다르게 공백은 연산자로 사용되지 않으며 입력된 텍스트 그대로 형태소 분석기에 전달됩니다.

     

    7. Prefix Query

      해당 접두어가 있는 모든 문서를 검색하는데 사용합니다.

    # "자전차"로 시작되는 영화 데이터 검색
    POST movie_search/_search
    {
      "query" : {
        "prefix": {
          "movieNm": "자전차"
            }
        }
    }

     

    8. Exists Query

      실제 값이 존재하는 문서만 찾고 싶을 때 사용합니다.

    # movieNm 칼럼에 값이 존재하는 문서 검색
    POST movie_search/_search
    {
      "query" : {
        "exists": {
          "field": "movieNm"
        }
      }
    }

     

    9. Wildcard Query

      와일드카드를 사용할 경우 단어의 첫 글자로는 절대 사용해서는 안됩니다. 첫 글자로 사용될 경우 색인된 전체 문서를 찾아야 하는 불상사가 발생할 수 있기 때문입니다. 또한, 와일드카드로 입력된 검색어는 형태소 분석이 이뤄지지 않습니다.

    옵션 설명
    * 문자의 길이와 상관없이 일치하는 모든 문서 검색
    ? 지정된 위치의 한 글자가 다른 경우의 문서 검색

      typeNm 필드에서 "장편"을 찾기 위해 다음과 같이 사용할 수 있습니다.

    POST movie_search/_search
    {
      "query" : {
        "wildcard": {
          "typeNm": "장?"
        }
      }
    }

     

    10. Nested Query

      Nested 데이터 타입의 필드를 검색할 때 사용합니다. Nested 데이터 타입은 문서 내부에 다른 문서가 존재할 때 사용합니다. path 옵션으로 중첩된 필드를 명시하고, query 옵션에 Nested 필드 검색에 사용할 쿼리를 입력합니다.

    POST movie_nested/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "repGenreNm": "멜로/로맨스"
              }
            },
            {
              "nested": {
                "path": "companies",
                "query": {
                  "bool": {
                    "must": [
                      {
                        "term": {
                          "companies.companyCd": "20173401"
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }
    반응형

    'BackEnd > elasticsearch' 카테고리의 다른 글

    14. 메트릭 집계(Metrics Aggregations)  (0) 2021.10.09
    13. 집계(Aggregation)  (0) 2021.10.06
    11. Query DSL 구조 및 파라미터  (0) 2021.10.02
    10. 검색 API  (0) 2021.09.25
    09. 문서관리 API(Document API)  (0) 2021.09.24

    댓글

Designed by Tistory.