AWS Elasticsearch Avg聚合Java API在特定时间段内使用Jest客户端检索结果时产生错误



我使用Elasticsearch SDK 2.3和Jest 2.0.0来创建客户端。我正试图获得平均聚合(和其他聚合)实现,这将从某个时间段检索结果。

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    //Queries builder
    searchSourceBuilder.query(QueryBuilders.matchAllQuery());
    GregorianCalendar gC = new GregorianCalendar();
    gC.set(2016, Calendar.OCTOBER, 18, 0, 0, 0);
    long from = gC.getTimeInMillis();
    gC.add(Calendar.MINUTE, 15);
    long to = gC.getTimeInMillis();
    searchSourceBuilder.postFilter(QueryBuilders.rangeQuery("timestamp").from(from).to(to));
    JestClient client = getJestClient();
    AvgBuilder aggregation2 = AggregationBuilders
            .avg(AvgAggregation.TYPE)
            .field("backend_processing_time");

    AggregationBuilder ag = AggregationBuilders.dateRange(aggregation2.getName())
            .addRange("timestamp", from, to).
            subAggregation(aggregation2);
    searchSourceBuilder.aggregation(ag);
    String query = searchSourceBuilder.toString();
    Search search = new Search.Builder(query)
            .addIndex(INDEX)
            .addType(TYPE)
            //                .addSort(new Sort("code"))
            .setParameter(Parameters.SIZE, 5)
            //                .setParameter(Parameters.SCROLL, "5m")
            .build();
    SearchResult result = client.execute(search);
    System.out.println("ES Response with aggregation:n" + result.getJsonString());

我得到的错误如下:

{"error":{"root_cause":[{"type":"aggregation_execution_exception","reason":"could not find the appropriate value context to perform aggregation [avg]"}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"elbaccesslogs_2016_10","node":"5ttEmYcTTsie-z23OpKY0A","reason":{"type":"aggregation_execution_exception","reason":"could not find the appropriate value context to perform aggregation "(avg)}}]},"状态":500}

看起来原因是"找不到合适的值上下文来执行聚合[avg]"…我不知道到底发生了什么。

有谁能给点建议吗?或者如果在回复之前需要更多信息,请告诉我。

谢谢,

Khurram

我自己已经找到了解决方案,所以我在下面解释并结束这个问题,如下所示:

基本上代码

searchSourceBuilder.postFilter(QueryBuilders.rangeQuery("timestamp").from(from).to(to)); 

不能用于聚合。我们需要删除'postFilter'代码和以下代码:

AggregationBuilder ag = AggregationBuilders.dateRange(aggregation2.getName())
    .addRange("timestamp", from, to).
    subAggregation(aggregation2);

并更改以下代码:

searchSourceBuilder.query(QueryBuilders.matchAllQuery());

searchSourceBuilder.query(
            QueryBuilders.boolQuery().
                    must(QueryBuilders.matchAllQuery()).
                    filter(QueryBuilders.rangeQuery("timestamp").from(from).to(to))
    );

下面是完整的代码:

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    GregorianCalendar gC = new GregorianCalendar();
    gC.set(2016, Calendar.OCTOBER, 18, 0, 0, 0);
    long from = gC.getTimeInMillis();
    gC.add(Calendar.MINUTE, 15);
    long to = gC.getTimeInMillis();
    searchSourceBuilder.query(
            QueryBuilders.boolQuery().
                    must(QueryBuilders.matchAllQuery()).
                    filter(QueryBuilders.rangeQuery("timestamp").from(from).to(to))
    );
    JestClient client = getJestClient(); // just a private method creating a client the way Jest client is created
    AvgBuilder avg_agg = AggregationBuilders
            .avg(AvgAggregation.TYPE)
            .field("backend_processing_time");
    searchSourceBuilder.aggregation(avg_agg);
    String query = searchSourceBuilder.toString();
    Search search = new Search.Builder(query)
            .addIndex(INDEX)
            .addType(TYPE)
            .setParameter(Parameters.SIZE, 10)
            .build();
    SearchResult result = client.execute(search);
    System.out.println("ES Response with aggregation:n" + result.getJsonString());

最新更新