spring data elasticsearch 复杂聚合查询

tech2025-10-12  3

DocumentType documentType = getDocumentType(queryCriteria); SearchQuery queryJson = QueryHelp.getQueryJson(queryCriteria); DateHistogramAggregationBuilder aggregationBuilder = getDateHistogram(); FiltersAggregationBuilder requestStateAgg = getRequestStateAgg(); //添加词聚合 aggregationBuilder.subAggregation(requestStateAgg); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(queryJson.getQuery()) .aggregation(aggregationBuilder); String[] indices = {documentType.getIndex()}; SearchRequest searchRequest = new SearchRequest(indices,searchSourceBuilder); try { SearchResponse response = template.getClient().search(searchRequest, RequestOptions.DEFAULT); ParsedDateHistogram aggregation = response.getAggregations().get(DATE_AGG); List<? extends Histogram.Bucket> buckets = aggregation.getBuckets(); for (Histogram.Bucket bucket : buckets) { System.out.println(bucket.getKeyAsString()); Filters serviceAgg = bucket.getAggregations().get(REQUEST_STATE_AGG); for (Filters.Bucket serviceAggBucket : serviceAgg.getBuckets()) { long docCount = serviceAggBucket.getDocCount(); String keyAsString = serviceAggBucket.getKeyAsString(); System.out.println("结果:"+keyAsString+" "+docCount); } } } catch (IOException e) { e.printStackTrace(); } /** * 词聚合 * @param field * @param aggName * @return */ private TermsAggregationBuilder getTermAgg(String field, String aggName) { TermsAggregationBuilder termAgg = AggregationBuilders.terms(aggName) .field(field) .size(20); return termAgg; } /** * 日期聚合 * @return */ private DateHistogramAggregationBuilder getDateHistogram() { DateHistogramAggregationBuilder aggregationBuilder = AggregationBuilders.dateHistogram(DATE_AGG) .format(DATE_FORMAT) .field(HANDEL_START_TIME) .order(BucketOrder.key(true)) .dateHistogramInterval(DateHistogramInterval.DAY) .timeZone(DateTimeZone.getDefault()); return aggregationBuilder; } /** * 查询条件桶 * @return */ private FiltersAggregationBuilder getRequestStateAgg() { RequestState[] requestStates = RequestState.values(); int length = requestStates.length; MatchQueryBuilder[] builders = new MatchQueryBuilder[length]; for (int i = 0; i < requestStates.length; i++) { RequestState state = requestStates[i]; MatchQueryBuilder requestStateQuery = getRequestStateQuery(state); builders[i]=requestStateQuery; } FiltersAggregationBuilder filters = AggregationBuilders.filters(REQUEST_STATE_AGG, builders); return filters; }

 

最新回复(0)