-
[spring] 스프링 elasticsearch NativeSearchQuery 사용방법Spring/spring boot 및 기타 2021. 3. 16. 18:37
ElasticsearchRepository search 메소드 내부에 NativeSearchQuery 를 넘겨 사용 가능하다.
또는 ElasticsearchTemplate 및 elasticsearchOperations 을 사용할떄도 NativeSearchQuery 를 사용할 수 있다.
쿼리 클래스의 종류로는
CriteriaQuery, StringQuery, NativeSearchQuery
NativeSearchQuery 란
복잡한 쿼리를 사용하려 할때 Criteria 로는 표현이 불가할때 사용한다.
CriteriaQuery 와 StringQuery 의 단점을 보완한 클래스이다.
ElasticsearchRepository 를 상속받아 사용하는 방식
@Repository public interface PersonRepository extends ElasticsearchRepository<Person, String> { }
또는
ElasticsearchOperations elasticsearchOperations 을 사용하여 사용가능하다.
@Resource ElasticsearchOperations elasticsearchOperations; @Resource PersonRepository personRepository;
두 클래스 중 하나를 사용하면 된다. elasticsearchOperations 은 elasticsearchTemplate 을 구현한 것이라 같게 봤다.
쿼리메소드 종류
matchQuery
// GET /person/_search // { // "query": { // "age": 30 // } // } // age 가 30 인 데이터 PageRequest pageRequest = PageRequest.of(0, 50); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("age", 30); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder() .withQuery(matchQueryBuilder) .withPageable(pageRequest) .withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); List<Person> content = sampleRepository.search(nativeSearchQuery).getContent(); // 쿼리스트링으로도 가능
termsQuery
//{ // "query": { // "terms": { // "firstname": ["vera", "kari"] // } // } //} PageRequest pageRequest = PageRequest.of(0, 50); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("firstname", "vera", "kari", "blake"); //term //TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("firstname", "Vera", "Kari", "Blake"); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder() .withQuery(termsQueryBuilder) .withPageable(pageRequest) .withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); List<Person> content = personRepository.search(nativeSearchQuery).getContent();
multiMatchQuery
// id 와 age 가 44 인 것 찾기 PageRequest pageRequest = PageRequest.of(0, 50); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("44", "id", "age"); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder() .withQuery(multiMatchQueryBuilder) .withPageable(pageRequest) .withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); List<Person> content = personRepository.search(nativeSearchQuery).getContent();
BoolQueryBuilder
PageRequest pageRequest = PageRequest.of(0, 50); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("firstname", "Effie")) .mustNot(QueryBuilders.matchQuery("gender", "M")) .should(QueryBuilders.matchQuery("balance", "3607")); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder) .withPageable(pageRequest) .withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); List<Person> content = personRepository.search(nativeSearchQuery).getContent();
IdsQueryBuilder
// GET /person/_search // { // "query": { // "ids": { // "values": [ // "25", // "44", // "126" // ] // } // } // } PageRequest pageRequest = PageRequest.of(0, 50); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); IdsQueryBuilder idsQueryBuilder = QueryBuilders.idsQuery().addIds("25", "44", "126"); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder() .withQuery(idsQueryBuilder) .withPageable(pageRequest) .withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); List<Person> content = personRepository.search(nativeSearchQuery).getContent();
DisMaxQueryBuilder
// GET /person/_search // { // "query": { // "dis_max": { // "tie_breaker": 0.7, // "boost": 1.2, // "queries": [ // { // "term": { // "firstname": { // "value": "Effie" // } // } // }, // { // "match": { // "gender": "m" // } // } // ] // } // } // } PageRequest pageRequest = PageRequest.of(0, 50); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); DisMaxQueryBuilder disMaxQueryBuilder = QueryBuilders.disMaxQuery() .add(QueryBuilders.termQuery("firstname", "Effie")) .add(QueryBuilders.matchQuery("gender", "m")) .boost(1.2f) .tieBreaker(0.7f); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder() .withQuery(disMaxQueryBuilder) .withPageable(pageRequest) .withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); List<Person> content = personRepository.search(nativeSearchQuery).getContent();
FuzzyQueryBuilder
PageRequest pageRequest = PageRequest.of(0, 50); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("firstname", "effie"); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder().withQuery(fuzzyQueryBuilder) .withPageable(pageRequest) .withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); List<Person> content = personRepository.search(nativeSearchQuery).getContent();
prefixQuery
PageRequest pageRequest = PageRequest.of(0, 50); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("firstname", "b"); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder() .withQuery(prefixQueryBuilder) .withPageable(pageRequest) .withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); List<Person> content = personRepository.search(nativeSearchQuery).getContent();
rangeQuery
PageRequest pageRequest = PageRequest.of(0, 50); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(20).to(30).includeLower(true).includeUpper(false); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder() .withQuery(rangeQueryBuilder) .withPageable(pageRequest) .withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); List<Person> content = personRepository.search(nativeSearchQuery).getContent();
PageRequest pageRequest = PageRequest.of(0, 50); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); //address: "398 Dearborn Court", 有3个term 查询court 结束的位置为 3 SpanFirstQueryBuilder spanFirstQueryBuilder = QueryBuilders.spanFirstQuery(QueryBuilders.spanTermQuery("address", "court"), 3); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder().withQuery(spanFirstQueryBuilder) .withPageable(pageRequest) .withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); List<Person> content = personRepository.search(nativeSearchQuery).getContent();
boolQuery
PageRequest pageRequest = PageRequest.of(0, 10); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("gender", "f")) .should(QueryBuilders.termQuery("address", "court")) .should(QueryBuilders.termQuery("state","md")) .filter(QueryBuilders.rangeQuery("age").gte(30)) .filter(QueryBuilders.rangeQuery("balance").gte(2726)); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder() .withQuery(boolQueryBuilder) .withPageable(pageRequest) .withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); List<Person> content = personRepository.search(nativeSearchQuery).getContent();
/** * * GET /person/_search { "query": { " function_score": { "query": { "match": { "gender": "F" } }, "field_value_factor": { "field": "balance", "modifier": "log1p", "factor": 0.5 } , "boost_mode": "sum" } } }*/ PageRequest pageRequest = PageRequest.of(0, 10); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); //bool query BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("gender", "F")); //feild_value_factor FieldValueFactorFunctionBuilder functionBuilder = ScoreFunctionBuilders.fieldValueFactorFunction("balance") .modifier(FieldValueFactorFunction.Modifier.LOG1P) .factor(0.5f); FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQueryBuilder, functionBuilder).boostMode(CombineFunction.SUM); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder() .withQuery(functionScoreQueryBuilder) .withPageable(pageRequest) .withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); Page<Person> page = personRepository.search(nativeSearchQuery); logger.info("page: "+page.toString()); List<Person> content = page.getContent();
functionScoreQuery
/** GET /person/_search { "query": { "function_score": { "query": { "match": { "gender": "F" } }, "gauss": { "balance": { "origin": "43951", "scale": "100", "offset": "10" } }, "boost_mode": "sum" } } } */ PageRequest pageRequest = PageRequest.of(0, 10); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); //bool query BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("gender", "F")); GaussDecayFunctionBuilder gaussDecayFunctionBuilder = ScoreFunctionBuilders.gaussDecayFunction("balance", "43951", "100", "10"); //builder FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQueryBuilder, gaussDecayFunctionBuilder).boostMode(CombineFunction.SUM); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder().withQuery(functionScoreQueryBuilder) .withPageable(pageRequest) //.withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); Page<Person> page = personRepository.search(nativeSearchQuery); logger.info("page: "+page.toString()); List<Person> content = page.getContent();
/** function_score weight query GET /person/_search { "query": { "function_score": { "query": { "bool": { "must": [ { "match": { "gender": "F" } },{ "range": { "age": { "gte": 25, "lte": 30 } } } ] } }, "functions": [ { "weight": 2 } ] } } } **/ PageRequest pageRequest = PageRequest.of(0, 10); FieldSortBuilder idSortBuilder = SortBuilders.fieldSort("id").order(SortOrder.ASC); //bool query BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("gender", "F")) .must(QueryBuilders.rangeQuery("age").gte(25).lte(30)); //weight buil WeightBuilder weightBuilder = ScoreFunctionBuilders.weightFactorFunction(2.0f); //builder FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQueryBuilder, weightBuilder).boostMode(CombineFunction.SUM); NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder() .withQuery(functionScoreQueryBuilder) .withPageable(pageRequest) //.withSort(idSortBuilder) .build(); String query = nativeSearchQuery.getQuery().toString(); logger.info(query); Page<Person> page = personRepository.search(nativeSearchQuery); logger.info("page: "+page.toString()); List<Person> content = page.getContent();
반응형'Spring > spring boot 및 기타' 카테고리의 다른 글
[spring boot] 스프링 부트 h2 인메모리 db 시작하기 (0) 2021.04.27 [spring] 스프링 HikariDatasource 속성 값 (0) 2021.03.31 [spring] 스프링 elasticsearch ElasticsearchRepository underscore 오류 해결방법 (0) 2021.03.16 [spring] 스프링에서 사용하는 RestTemplate - http 라이브러리 (0) 2021.02.26 [spring boot] 스프링부트 에서 elasticsearch 시작하기 (1) 2021.02.24