0

Я пытаюсь использовать пружинные данные ElasticSearch для некоторых агрегатахElasticSearch DateHistogram Aggregation Заполните отсутствующие данные

Вот мой запрос

final FilteredQueryBuilder filteredQuery = QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(), 
     FilterBuilders.andFilter(FilterBuilders.termFilter("gender", "F"), 
     FilterBuilders.termFilter("place", "Arizona"), 
     FilterBuilders.rangeFilter("dob").from(from).to(to))); 

final MetricsAggregationBuilder<?> aggregateArtifactcount = AggregationBuilders.sum("delivery") 
      .field("birth"); 

    final AggregationBuilder<?> dailyDateHistogarm = 
     AggregationBuilders.dateHistogram(AggregationConstants.DAILY).field("dob") 
     .interval(DateHistogram.Interval.DAY).subAggregation(aggregateArtifactcount); 

    final SearchQuery query = new NativeSearchQueryBuilder().withIndices(index).withTypes(type) 
     .withQuery(filteredQuery).addAggregation(dailyDateHistogarm).build(); 

    return elasticsearchTemplate.query(query, new DailyDeliveryAggregation()); 

Кроме того, это моя Aggregation

 public class DailyDeliveryAggregation implements ResultsExtractor<List<DailyDeliverySum>> { 

@SuppressWarnings("unchecked") 
@Override 
public List<DailyDeliverySum> extract(final SearchResponse response) { 
    final List<DailyDeliverySum> dailyDeliverySum = new ArrayList<DailyDeliverySum>(); 
    final Aggregations aggregations = response.getAggregations(); 
    final DateHistogram daily = aggregations.get(AggregationConstants.DAILY); 
    final List<DateHistogram.Bucket> buckets = (List<DateHistogram.Bucket>) daily.getBuckets(); 
    for (final DateHistogram.Bucket bucket : buckets) { 
     final Sum sum = (Sum) bucket.getAggregations().getAsMap().get("delivery"); 
     final int deliverySum = (int) sum.getValue(); 
     final int delivery = (int) bucket.getDocCount(); 
     final String dateString = bucket.getKeyAsText().string(); 
     dailyDeliverySum.add(new DailyDeliverySum(deliverySum, delivery, dateString)); 
    } 
    return dailyDeliverySum; 
} 
} 

Это дает мне правильные данные, но это не удовлетворяет всем моим потребностям Предположим, если я запрашиваю временной диапазон 10 дней, если нет данных для даты в заданном временном диапазоне Он пропустил эту дату в ведрах гистограммы даты. Но я хочу установить 0 в качестве значения по умолчанию для агрегации и количества документов, если нет данных

Есть ли способ сделать это ??

ответ

1

Да, вы можете использовать "minimum document count" feature из date_histogram агрегации и установите его в 0. Таким образом, вы также получите ведра, которые не содержат каких-либо данных:

final AggregationBuilder<?> dailyDateHistogarm = 
    AggregationBuilders.dateHistogram(AggregationConstants.DAILY) 
     .field("dob")   
     .minDocCount(0)       <--- add this line 
     .interval(DateHistogram.Interval.DAY) 
     .subAggregation(aggregateArtifactcount); 
+0

благодаря работает @Val – edwin

+0

Мне нужно добавить .extendedBounds (from, to) вместе с .minDocCount (0), чтобы заставить его работать – edwin

Смежные вопросы