ElasticSearch 실전(8)QueryDSL

QueryDSL은 Elasticsearch에서 제공하는 JSON 형식의 영역별 언어로 다양한 복잡한 조회를 수행할 수 있습니다.
HTTP 요청 예:
GET /website/_search
{
	"query": {
		"match_all": {}
	}
}

Spring-data-elasticsearch 코드 예:
Request request = new Request("GET", "/website/_search");
request.setJsonEntity("{\"query\":{\"match_all\":{}}}");
Response response = restClient.performRequest(request);

모든 것을 조회하고 날짜에 따라 거꾸로 배열하여 앞의 10개를 찾다
{
	"query": {
		"match_all": {}
	},
	"sort": {
		"date": {
			"order": "desc"
		}
	},
	"from": 0,
	"size": 10
}

검색 author 필드에 키워드 포함 Smith
{
	"query": {
		"match": {
			"author": "Smith"
		}
	}
}

좋아요 수가 40인 문서 조회
{
	"query": {
		"match": {
			"likes": "40"
		}
	}
}

검색 텍스트 필드에 "I like"라는 단어가 포함되어 있고 명중 부분의 하이라이트 정보를 되돌려줍니다.
{
	"query": {
		"match_phrase": {
			"text": "I like"
		}
	},
	"highlight": {
		"fields": {
			"text": {}
		}
	}
}

여러 필드 (author,text) 에서 조회
{
	"query": {
		"multi_match": {
			"query": "I like Jane",
			"fields": ["author", "text"]
		}
	},
	"highlight": {
		"fields": {
			"text": {},
			"author": {}
		}
	}
}

bool 조회는 볼 논리를 사용하여 기초적인 조회를 복잡한 조회로 구성한다
검색 author 필드에 Smith 및 Jane 포함
{
	"query": {
		"bool": {
			"must": [{
				"match": {
					"author": "Smith"
				}
			}, {
				"match": {
					"author": "Jane"
				}
			}]
		}
	}
}

검색 author 필드에는 Smith 또는 Jones가 있지만 Jane은 사용할 수 없습니다.
{
	"query": {
		"bool": {
			"should": [{
				"match": {
					"author": "Smith"
				}
			}, {
				"match": {
					"author": "Jones"
				}
			}],
			"must_not": {
				"match": {
					"author": "Jane"
				}
			}
		}
	}
}

필터 사용
{
	"query": {
		"bool": {
			"must": {
				"match_all": {}
			},
			"filter": [{
				"range": {
					"likes": {
						"gte": 20,
						"lte": 100
					}
				}
			}, {
				"term": {
					"author.keyword": "John Smith"
				}
			}]
		}
	}
}

작성자별 문서 수 집계
{
	"size": 0,
	"aggs": {
		"group_by_author": {
			"terms": {
				"field": "author.keyword"
			}
		}
	}
}

작성자가 발표한 각 문서의 수를 집계하고 작성자가 발표한 문서의 좋아요 수 평균을 계산하며 이 평균을 거꾸로 배열합니다
{
	"size": 0,
	"aggs": {
		"group_by_author": {
			"terms": {
				"field": "author.keyword",
				"order": {
					"average_likes": "desc"
				}
			},
			"aggs": {
				"average_likes": {
					"avg": {
						"field": "likes"
					}
				}
			}
		}
	}
}

좋은 웹페이지 즐겨찾기