Elastic Search

Ch04. 데이터 검색 - Query DSL의 주요 쿼리

webmaster 2025. 9. 14. 18:01
728x90

Match All Query

POST movie_search/_search
{
  "query": {
    "match_all": {}
  }
}
  • matchAll Query는 색인된 모든 문서를 검색하는 쿼리이다.(색인에 저장된 문서를 확일할 때 사용한다.)

Match Query

POST movie_search/_search
{
  "query": {
    "match": {
      "movieNm": "그대 장미"
    }
  }
}
  • 텍스트, 숫자, 날짜 등이 포함된 문장을 형태소 분석을 통해 Term으로 분리한 후 Term을 이용해 검색 질의를 수행
  • operator를 지정하지 않았기 때문에, OR 연산으로 "그대", "장미" 검색을 수행한다.

Multi Match Query

POST movie_search/_search
{
  "query": {
    "multi_match": {
      "query": "가족",
      "fields": ["movieNm", "movieNmEn"]
    }
  }
}
  • Match Query와 기본적인 사용 방법은 동일하나, 여러 개의 필드를 대상으로 검색해야 할 때 사용하는 쿼리이다.

Term Query

POST movie_search/_search
{
  "query": {
    "term": {
      "genreAlt": "코미디"
    }
  }
}
  • 별도의 분석 작업을 수행하지 않고 입력된 텍스트가 존재하는 문서를 찾는다.
  • Keyword 데이터 타입을 사용하는 필드를 검색하려면 Term Query를 사용해야 한다.
  • Term Query의 경우 검색어를 하나의 텀으로 처리하기 때문에 텀이 정확히 존재하지 않는 경우 검색이 되질 않는다.(영문 대소문자가 다를 경우도 검색 X)

Bool Query

{
  "query": {
    "bool": {
      "must": [      ],
      "must_not": [      ],
      "should": [      ],
      "filter": [      ]
    }
  }
}
  • Bool Query를 상위에 두고 하위에 다른 Query들을 사용해 복잡한 조건의 쿼리문을 작성할 수  있다.
  • must: 반드시 조건에 만족하는 문서만 검색된다.
  • must not: 조건에 만족하지 않는 문서가 검색된다.
  • should: 여러 조건 중 하나 이상을 만족하는 문서가 검색된다.
  • filter: 조건을 포함하고 있는 문서를 출력한다.(스코어별 정렬은 X)

Query String

POST movie_search/_search
{
  "query": {
    "query_string": {
      "default_field": "movieNm",
      "query": "(가정) AND (어린이 날)"
    }
  }
}
  • 엘라스틱에서 내장된 쿼리 분석기가 있는데 query_string 파라미터를 사용하는 쿼리 작성 시 쿼리 분석기를 이용하는 질의를 할 수 있다.

Prefix Query

POST movie_search/_search
{
  "query": {
    "prefix": {
      "movieNm": "자전차"
    }
  }
}
  • 해당 접두어가 있는 모든 문서를 검색하는 데 사용한다.
  • 역색인된 Term은 사전순으로 정렬되고, Prefix Query는 저장된 Term들을 스캔해서 일치하는 Term을 찾는다.

Exists Query

POST movie_search/_search
{
  "query": {
    "exists": {
      "field": "movieNm"
    }
  }
}
  • 실제 값이 존재하는 문서만 찾고 싶을 때 사용한다.
  • 필드 값이 null이거나 문서에 필드 자체가 없는 문서를 찾고 싶다면 must_not을 사용하면 된다.

Wildcard Query

POST movie_search/_search
{
  "query": {
    "wildcard": {
      "typeNm": "장*"
    }
  }
}
  • 검색어가 와일드카드와 일치하는 구문을 찾는다.(형태소 분석이 이뤄지지 않는다.)
    • *: 문자의 길이와 상관없이 와일드카드와 일치하는 모든 문서를 찾는다.
    • ?: 지정된 위치의 한 글자가 다른 경우의 문서를 찾는다.
  • 와일드카드를 사용할 경우 단어의 첫 글자로 절대 사용하면 안 된다(색인된 전체 문서를 찾아야 하는 불상사가 발생할 수 있기 때문)

Nested Query

GET movie_nested/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "reGenreNm": "멜로/로맨스"
          }
        },
        {
          "nested": {
            "path": "companies",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "companies.companyCd": "20173401"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
  • 분산 환경에서 SQL 조인과 유사한 기능을 제공하는 Nested Query를 제공한다.
  • Nested 데이터 타입의 필드를 검색할 때 사용하며, Nested는 문서 안에 다른 문서가 있을 때 사용한다.
    • path 옵션으로 중첩된 필드를 명시하고, query 옵션에 Nested 필드 검색에 사용할 쿼리를 입력한다.
  • 엘라스틱서치는 성능상 Parent와 Child 문서를 모두 동일한 샤드에 저장하며, 이 방식으로 인해 네트워크 비용을 대폭 줄이는 것이 가능하다.
    • 단, 특정 Parent 문서에 포함된 Child 문서가 비정상적으로 커질 경우 샤드의 크기가 일정하게 분배되지 못하는 문제점이 발생할 수 있기 때문에 설계가 중요하다.
728x90