시뻘건 개발 도전기

데이터 검색: Query DSL 주요 쿼리 본문

카테고리 없음

데이터 검색: Query DSL 주요 쿼리

시뻘건볼때기 2023. 12. 14. 23:44
반응형

Match All Query

match_all 파라미터를 사용하는 Match All Query는 색인에 모든 문서를 검색하는 쿼리다. 가장 단순한 쿼리로 일반적으로 색인에 저장된 문서를 확인할 때 사용된다.

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

 

Match Query

문장을 형태소 분석을 통해 텀으로 분리한 후 이 텀들을 이용해 검색 질의를 수행한다.

POST movie_search/_search
{
	"query": {
		"match": {
			"movieNm":"그대 장미"
		}
	}
}

 

Multi Match Query

multi_match 파라미터를 사용한다. Match Query와는 다르게 여러 개의 필드를 대상으로 검색해야할 때 사용한다.

POST movie_search/_search
{
	"query": {
		"multi_match": {
			"query": "7",
			"fields": ["movieNm", "movieNmEn"]
		}
	}
}

 

Term Query

엘라스틱서치는 텍스트 형태의 값을 검색하기 위해 두 가지 맵핑 유형을 지원한다. Match Query는 쿼리를 수행하기 전에 먼저 분석기를 통해 텍스트를 분석한 후 검색을 수행한다. 하지만 Term Query는 별도의 분석 작업을 수행하지 않고 입력된 텍스트가 존재하는 문서를 찾는다. 따라서 Keyword 데이터 타입을 사용하는 필드를 검색하려면 Term Query를 사용해야한다.

POST movie_search/_search
{
	"query" : {
		"term": {
			"genreAlt": "2014"
		}
	}
}

[표 1] 문자형 데이터 타입

 

Bool Query

엘라스틱서치에서는 하나의 쿼리나 여러 개의 쿼리를 조합해서 더 높은 스코어를 가진 쿼리 조건으로 검색을 수행할 수 있다. 이러한 유형의 쿼리를 Compound Qeury하 하는데, 이를 구현하기 위해서는 Bool Query를 사용한다. Bool Query는 주어진 쿼리와 논리적으로 일치하는 문서를 복합적으로 검색한다. 해당 쿼리를 사용해 AND, OR, NAND, FILTER를 표현할 수 있다.

{
	"query": {
		"bool": {
			"must":[
				{
					"term": {
						"repGenreNm": "코미디"
					}
				},
				{
					"match": {
						"repNationNm": "한국"
					}
				}
			],
			"must_not": [
				{
					"match": {
						"typeNm": "단편"
					}
				}
			],
#			"should": [],
#			"filter": []
		}
	}
}

[표 2] SQL 구문의 조건절과 비교

 

Query String

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

POST movie_search/_search
{
	"query":{
		"query_string": {
			"default_field": "movieNm",
			"query": "(가정) AND (어린이 날)"
		}
	}
}

 

Prefix Query

해당 접두어가 있는 모든 문서를 검색할 때 사용된다. 역색인된 텀은 사전순으로 정렬되고 Prefix Query는 저장된 텀들을 스캔해서 일치하는 텀을 찾는다.

POST movie_search/_search
{
	"query":{
		"prefix": {
			"movieNm": "자전차"
		}
	}
}

 

Exists Query

문서를 색인할 때 필드의 값이 없다면 필드를 생성하지 않거나 필드의 값을 null로 설정할 때가 있다. 이러한 데이터를 제외하고 실제 값이 존재하는 문서만 찾고 싶다면 Exosts Query를 사용한다.

POST movie_search/_search
{
	"query":{
		"exists": {
			"field": "movieNm"
		}
	}
}

 

Wildcard Query

검색어가 와일드카드와 일치하는 구문을 찾는다. 이 때 입려된 검색어는 형태소 분석이 이루어지지 않는다.

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

 

[표 3]  와일드카드 옵션

 

Nested Query

분산 시스템에서 SQL에서 지원하는 조인(join)과 유사한 기능을 수행하려면 엄청 많은 비용이 소모될 것이다. 수평적으로 샤드가 얼마나 늘어날지 모르는 상황에서 모든 샤드를 검색해야할 수도 있기 때문이다. 엘라스틱서치에서는 분산 데이터 환경에서도 SQL 조인과 같은 유사한 기능을 수행하는 Nested Query를 제공한다. 이는 Nested 타입의 필드를 검색할 때 사용한다. Nested 타입은 문서 내부에 다른 문서가 존재할 때 사용한다. path 옵션으로 중첩된 필드를 명시하고 query 옵션에 Nested 필드 검색에 사용할 쿼리를 입력한다. 참고로 엘라스틱서치는 성능상의 이유로 Parent 문서와 Child 문서를 모두 동일한  샤드에 저장한다. 이러한 방식을 통해 네트워크 비용을 대폭 줄일 수 있다. 하지만 Child 문서가 비정상적으로 커질 경우 샤드의 크기가 일정하게 분배되지 못한다.

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