栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

ElasticSearch中aggs里面套aggs的javaAPI实现

ElasticSearch中aggs里面套aggs的javaAPI实现

Kibana命令如下
GET person/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "address": "外滩"
          }
        }
      ]
    }
    
  },
  "aggs": {
    "age": {
      "terms": {
        "field": "age",
        "size": 10
      },
      "aggs": {
        "name": {
          "terms": {
            "field": "name",
            "size": 10
          }
        }
      }
    }
  }
}

运行结果如下:

问题:如何获取aggs里面的aggs数据 将es命令转为JavaAPI代码
package com.yy.esdemo;

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchPhraseQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest()
public class countStatusTest {
    @Autowired
    private RestHighLevelClient client;
    @Test
    public void test1() throws IOException {
        ArrayList indexes = new ArrayList<>();
        // 1.1 构建查询请求对象,指定查询的索引名称
        SearchRequest searchRequest = new SearchRequest("person");
        //5 创建查询条件构建器 SearchSourceBuilder
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        // 2 构建boolQuery
        BoolQueryBuilder query = QueryBuilders.boolQuery();
        // 3 构建各个查询条件
        // 3.1 满足是当前索引的内容
        MatchPhraseQueryBuilder matchPhraseQuery = QueryBuilders.matchPhraseQuery("address", "外滩");
        query.filter(matchPhraseQuery);
        //3.2 将这个boolQuery执行
        sourceBuilder.query(query);

        //3.3 构建agg查询,获取当前路径
        TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("age").field("age").size(100);
        // 3.4 第二给agg:将当前路径其他状态码过滤出来
        aggregationBuilder.subAggregation(AggregationBuilders.terms("name").field("name").size(100));
        sourceBuilder.aggregation(aggregationBuilder);


        //4 添加查询条件构建器SearchSourceBuilder
        searchRequest.source(sourceBuilder);
        //6 准确计数
        sourceBuilder.trackTotalHits(true);

        //1 查询,获取查询结果
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);


        // 7 获取聚会结果
        Aggregations aggregations = searchResponse.getAggregations();
        // 8 将结果转为map
        Map aggregationMap = aggregations.asMap();
        // 9 获取结果中上面定义的ages里面的数据,并将结果转为Term类型
        Terms ages = (Terms) aggregationMap.get("age");
        //获取桶里面的数据
        List buckets = ages.getBuckets();
        //将桶中的age数据获取到
        List aggsLists = new ArrayList<>();
        //获取当前所有的全部请求数量
        long count = serviceCount("person");
        for (Terms.Bucket bucket : buckets) {
            Object key = bucket.getKey();
            long docCount1 = bucket.getDocCount();
            StringBuffer sb = new StringBuffer();
            sb.append("非200/所有请求结果为:"+getPercent(docCount1,count)+"/nn");
            sb.append(key+"服务总数为:"+docCount1+"/n"+"n"+"{/n"+"n");

            //获取第二个aggs
            Aggregations aggregations1 = bucket.getAggregations();
            Map asMap = aggregations1.getAsMap();
            Terms name = (Terms) asMap.get("name");
            List buckets1 = name.getBuckets();
            for (Terms.Bucket bucket1 : buckets1) {
                Object key1 = bucket1.getKey();
                long docCount = bucket1.getDocCount();
                sb.append("    "+key1+":"+docCount+",/n"+"n");
            }
            sb.append("},/n"+"n");
            aggsLists.add(sb.toString());

        }
        System.out.println("===============");
        for (String aggsList : aggsLists) {
            System.out.println(aggsList);
        }



    }
    //获取当前索引的所有请求的数量
    public long serviceCount(String yesterday_logging) throws IOException {


        // 1.1 构建查询请求对象,指定查询的索引名称
        SearchRequest searchRequest = new SearchRequest(yesterday_logging);
        // 2 构建boolQuery
        BoolQueryBuilder query = QueryBuilders.boolQuery();
        // 3 构建各个查询条件
        MatchPhraseQueryBuilder matchPhraseQuery = QueryBuilders.matchPhraseQuery("address", "外滩");
        query.filter(matchPhraseQuery);

        //5 创建查询条件构建器 SearchSourceBuilder
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //4 添加查询条件构建器SearchSourceBuilder
        searchRequest.source(sourceBuilder);
        //6 准确计数
        sourceBuilder.trackTotalHits(true);

        //1 查询,获取查询结果
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        // 7 获取命中对象 SearchHits
        SearchHits searchHits = searchResponse.getHits();
        //7.1 获取总记录数
        long value = searchHits.getTotalHits().value;
        System.out.println("serviceCount方法中的总记录数:"+value);
        return value;
    }

    //获取比值
    public double getPercent(Long fz,Long fm){
        return Double.parseDouble(String.valueOf(fz))/Double.parseDouble(String.valueOf(fm));
    }

}

测试结果如下:

关键JavaAPI
//3.3 构建agg查询,获取当前路径
TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("age").field("age").size(100);
// 3.4 第二给agg:将当前路径其他状态码过滤出来
aggregationBuilder.subAggregation(AggregationBuilders.terms("name").field("name").size(100));
sourceBuilder.aggregation(aggregationBuilder);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/708060.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号