es高级客户端聚合查询api快速入门


    //聚合查询
    @Test
    void Collection_query() throws IOException {

        SearchRequest searchRequest = new SearchRequest().indices("users");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));

        //条件max("maxid")  maxid:结果名称
        MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("maxid").field("id");

        //聚合查询  aggregation
        searchSourceBuilder.aggregation(maxAggregationBuilder);
        searchRequest.source(searchSourceBuilder);


        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        //获取聚合后的结果 可以使用类型强转
        Max max = (Max) searchResponse.getAggregations().asMap().get("maxid");

        System.out.println(max.getValue());


    }

    //分组查询
    //按名字分组  子聚合里面查看平均年龄
    @Test
    void group_search() throws IOException {
        Logger logger = LogManager.getRootLogger();
        SearchRequest searchRequest = new SearchRequest("users");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.size(0);//不返回 hits 里的数据 提高性能
        searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));

        //按照name分组
        TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("nameGroup").field("name.keyword");
        //子聚合 平均age
        termsAggregationBuilder.subAggregation(AggregationBuilders.avg("avg_age").field("age"));
        //聚合查询  aggregation
        searchSourceBuilder.aggregation(termsAggregationBuilder);
        searchRequest.source(searchSourceBuilder);


        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        Map<String, Aggregation> asMap = searchResponse.getAggregations().getAsMap();
        //需要强转
        Terms terms = (Terms) asMap.get("nameGroup");

        logger.info(terms.getDocCountError());
        logger.info(terms.getSumOfOtherDocCounts());

        for (Terms.Bucket bucket : terms.getBuckets()) {
            logger.info("key: " + bucket.getKeyAsString());
            logger.info("docCount: " + bucket.getDocCount());
            logger.info("docCountError: " + bucket.getDocCountError());
            //注意这里用 具体聚合类型接受  平均:Avg
            Avg avg_age = bucket.getAggregations().get("avg_age"); //获取子聚合
            logger.info("avg_age:" + avg_age.getValue());
            logger.info("------------------------------------");
        }


    }


    /*

es的建议搜索  suggest_mode:建议模式 missing,popular,always
GET users/_search
{
"suggest": {
  "name_suggest": {
    "text": "迪丽热巴5",
    "term": {
      "field": "name.keyword",
      "suggest_mode":"popular"
    }
  }
}
}

    * */


    //建议查询
    //词项建议拼写检查,检查用户的拼写是否错误,如果有错给用户推荐正确的词,appel->apple
    @Test
    void suggest_search() throws IOException {
        Logger logger = LogManager.getRootLogger();

        SearchRequest searchRequest = new SearchRequest("users");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.size(0);
        searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));


        //创建termSuggestion聚合
        TermSuggestionBuilder termSuggestionBuilder = SuggestBuilders.termSuggestion("name.keyword").text("迪丽热巴9");
        //可以设置建议模式  默认为 missing :意思是 分词器没有才能查询出
        termSuggestionBuilder.suggestMode(TermSuggestionBuilder.SuggestMode.POPULAR);
        //创建主建议查询类
        SuggestBuilder suggestBuilder = new SuggestBuilder();
        //指定名字 并添加
        suggestBuilder.addSuggestion("suggest_name", termSuggestionBuilder);
        //放入条件
        searchSourceBuilder.suggest(suggestBuilder);
        //加入搜索请求
        searchRequest.source(searchSourceBuilder);
        //执行 返回结果
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        //处理结果  注意:用TermSuggestion接受(自动转换)
        TermSuggestion termSuggestion = searchResponse.getSuggest().getSuggestion("suggest_name");

        for (TermSuggestion.Entry entry : termSuggestion.getEntries()) {
            //获取自己的数据text: 迪丽热巴9
            logger.info("text: " + entry.getText().string());

            for (TermSuggestion.Entry.Option option : entry) {
                /*
                结果集数据
            :    suggest option : 迪丽热巴2
            :    suggest option : 迪丽热巴3
            :    suggest option : 迪丽热巴
                * */
                String suggestText = option.getText().string();
                logger.info("   suggest option : " + suggestText);
            }
        }

    }


    /*
#自动补全功能 必须数据类型为completion
根据用户的输入联想到可能的词或者短语
GET movies/_search
{
  "_source": "",
  "suggest": {
    "name_suggest": {
      "prefix": "ht",
      "completion": {
        "field": "name"
      }
    }
  }

}
    * */


    @Test
    void suggest_prefix() throws IOException {
        Logger logger = LogManager.getLogger();
        SearchRequest searchRequest = new SearchRequest("movies");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.size(0);
        searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));

        SuggestBuilder suggestBuilder = new SuggestBuilder();
        //skipDuplicates 跳过重复项 默认false
        CompletionSuggestionBuilder completionSuggestionBuilder = SuggestBuilders.completionSuggestion("name").prefix("ht").skipDuplicates(true);

        suggestBuilder.addSuggestion("name_suggest", completionSuggestionBuilder);

        searchSourceBuilder.suggest(suggestBuilder);
        searchRequest.source(searchSourceBuilder);

        //发送请求
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        //处理请求   注意 用聚合后的结果类型接受 (自动转换)
        CompletionSuggestion completionSuggestion=searchResponse.getSuggest().getSuggestion("name_suggest");


        for (CompletionSuggestion.Entry options : completionSuggestion) {
            //自己传入的参数  ht
            logger.info(" text:"+options.getText().string());

            for (CompletionSuggestion.Entry.Option option : options) {
                logger.info("   suggest option : "+option.getText().string());
            }
            /*
2021-05-06 09:44:21.924  INFO 21636 --- [           main] c.h.s.SpringdataEsApplicationTests       : text: ht
2021-05-06 09:44:21.928  INFO 21636 --- [           main] c.h.s.SpringdataEsApplicationTests       :    suggest option : htaaaa
2021-05-06 09:44:21.928  INFO 21636 --- [           main] c.h.s.SpringdataEsApplicationTests       :    suggest option : htbbbb
2021-05-06 09:44:21.929  INFO 21636 --- [           main] c.h.s.SpringdataEsApplicationTests       :    suggest option : htcccc
2021-05-06 09:44:21.930  INFO 21636 --- [           main] c.h.s.SpringdataEsApplicationTests       :    suggest option : htdddd
2021-05-06 09:44:21.931  INFO 21636 --- [           main] c.h.s.SpringdataEsApplicationTests       :    suggest option : hteeee
            * */

        }

    }
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值