前言
现在需要使用java从ES库中查询出某些字段以及其数量,以及所属其他的字段。如下图
媒体类型 | 媒体名称 | 文章数量 |
---|---|---|
新闻 | 证券之星-公司公告 | 6 |
微信 | 概率扑克噢 | 2 |
新闻 | 同花顺-独家公告解读 正文 | 2 |
平媒 | 市场星报 | 2 |
1.BoolQueryBuilder
根据publishTime设置查询范围。
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.rangeQuery("publishTime")
.gte(beginTime)
.lte(endTime)
.format("yyyy-MM-dd HH:mm:ss")
.timeZone("+08:00"));
2.设置分组
//使用两次分组分组查询,以媒体名称/webName为主 默认十条数据
TermsAggregationBuilder termsSourceTypeSourcePlaceGroup = AggregationBuilders.terms("sourceTypeGroup")
.field("sourceType");//根据媒体名称分组
TermsAggregationBuilder sourcePlaceGroup = AggregationBuilders.terms("webNameGroup")//根据媒体类型分组
.field("webName").subAggregation(termsSourceTypeSourcePlaceGroup);
3.分组查询
//分组查询
SearchResponse searchResponse = elasticsearchTemplate.getClient().prepareSearch(ApiState.INDEX_NAME)
.setQuery(boolQueryBuilder)
.addAggregation(sourcePlaceGroup)
.get();
Aggregations aggregations = searchResponse.getAggregations();
4.获取查询结果
//获取主分组信息
Terms sourceType = aggregations.get("webNameGroup");
//遍历主分组获取媒体名称信息以及文章个数
for (Terms.Bucket bucket : sourceType.getBuckets()) {
Map<String, Object> result = new HashMap<>();
result.put("webName", bucket.getKeyAsString());
result.put("value",bucket.getDocCount());
//获取域名分组信息 取第一个元素
Terms urlSourcetype = bucket.getAggregations().get("urlGroup");
if (urlSourcetype.getBuckets().size()>0){
result.put("url",urlSourcetype.getBuckets().get(0).getKeyAsString());
}
//获取媒体来源分组信息 去第一个元素
Terms sourceTypeSourcetype = bucket.getAggregations().get("sourceTypeGroup");
if(sourceTypeSourcetype.getBuckets().size()>0){
result.put("sourceType",MediaStatus.getDescription(sourceTypeSourcetype.getBuckets().get(0).getKeyAsString()));
}
//加入到集合
resultList.add(result);
}