ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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();
    반응형

    댓글

Designed by Tistory.