-
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