用elasticsearch聚合函数实现distinct查询

本文介绍了如何在Elasticsearch中使用聚合函数实现类似SQL中的distinct查询,提供了Controller和Service层的示例代码,并给出了详细注解链接供进一步学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.等价的sql

Sql代码 :

SELECT DISTINCT field1,field2 FROM test_index.test_type  

等价于

Sql代码:

SELECT field1,field2 FROM test_index.test_type GROUP BY field1,field2  

Controller:
这是根据类型和传过来的可变字段key来查询

 /**
     * 布局管理-聚合查询
     * @param logType
     * @return
     */
    @Override
    @GetMapping("/logs/layout/manager")
    public Map queryLayout(@RequestParam(required = false) String logType, @RequestParam(required = false) String modifiableKey){
        Map<String, Object> map = new HashMap<>();
        if (modifiableKey != null) {
//            List<String> modifiableKeyList = Arrays.asList(modifiableKeys.split(","));//用逗号隔开
//            for (String modifiableKey : modifiableKeyList) {
//              }
            List operationRecords = appleAppOperationLogService.queryLayout(logType, modifiableKey);
            map.put(modifiableKey, operationRecords);
        }
        return map;
    }

Service:

/**
     * 根据logType查询modifiableKey 不重复
     * @param logType
     * @return
     */
    @Override
    public List queryLayout(String logType, String modifiableKey) {

        List list = new ArrayList();
        //聚合
        TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("modifiableKey").field(modifiableKey+".keyword");

        SearchRequest searchRequest = new SearchRequest(INDEX);
        searchRequest.types(TYPE);

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

        boolQueryBuilder.must(QueryBuilders.matchAllQuery());//查询所有 此处为匹配所有文档
        //elasticsearch 里默认的IK分词器是会将每一个中文都进行了分词的切割,所以你直接想查一整个词  加上.keyword
        boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("logType.keyword", logType));

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 1.创建并设置SearchSourceBuilder对象

        sourceBuilder.query(boolQueryBuilder);
        sourceBuilder.aggregation(aggregationBuilder);//聚合查询
        searchRequest.source(sourceBuilder);

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

            Aggregations aggregations = searchResponse.getAggregations();
            Aggregation tags = aggregations.asMap().get("modifiableKey");

           Terms teamSum= (Terms)tags;
            List<? extends Terms.Bucket> buckets = teamSum.getBuckets();
            for (Terms.Bucket bucket : buckets) {
                list.add(bucket.getKeyAsString());
            }
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }

        return list;
    }

还想了解更多的话,转到这里:https://blog.youkuaiyun.com/jsiostream/article/details/87272784 注解很详细

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值