GET person/_search
{
"query": {
"bool": {
"filter": [
{
"match": {
"address": "外滩"
}
}
]
}
},
"aggs": {
"age": {
"terms": {
"field": "age",
"size": 10
},
"aggs": {
"name": {
"terms": {
"field": "name",
"size": 10
}
}
}
}
}
}
运行结果如下:
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 extends Terms.Bucket> 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 extends Terms.Bucket> 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));
}
}
测试结果如下:
//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);



