用elasticsearch聚合函數實現distinct查詢

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.csdn.net/jsiostream/article/details/87272784 註解很詳細

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章