【问题标题】:ElasticSearch DateHistogram Aggregation Fill Missing DataElasticSearch DateHistogram 聚合填充缺失数据
【发布时间】:2015-10-16 09:22:14
【问题描述】:

我正在尝试将 ElasticSearch spring 数据用于一些聚合

这是我的查询

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());

这也是我的聚合

        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 设置为聚合和文档计数的默认值没有可用的数据

有什么办法吗??

【问题讨论】:

    标签: java spring elasticsearch spring-data spring-data-elasticsearch


    【解决方案1】:

    是的,您可以使用 date_histogram 聚合的 "minimum document count" feature 并将其设置为 0。这样,您还将获得不包含任何数据的存储桶:

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

    【讨论】:

    • 我需要添加 .extendedBounds(from, to) 和 .minDocCount(0) 以使其工作
    【解决方案2】:

    @Val 的示例本身对我不起作用(我正在使用 ElasticSearch 6.2.x 的高级 API)。但是,起作用的是告诉聚合应该将缺失值处理为 0:

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

    【讨论】:

      猜你喜欢
      • 2022-10-31
      • 2014-12-11
      • 1970-01-01
      • 2018-03-22
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      相关资源
      最近更新 更多