AWS Elasticsearch Avg aggregation Java API генерирует ошибку при попытке получить результаты с помощью Jest client в течение определенного периода времени

#elasticsearch #elasticsearch-2.0

#elasticsearch #elasticsearch-2.0

Вопрос:

Я использую 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());
  

И ошибка, которую я получаю, заключается в следующем:

{«ошибка»:{«root_cause»:[{«тип»: «исключение aggregation_execution_exception», «причина»: «не удалось найти соответствующий контекст значения для выполнения агрегации [среднее значение]»}], «тип»:»исключение search_fase_execution_exception», «причина»: «все сегменты failed»,»phase»:»query»,»grouped»:true,»failed_shards»:[{«shard»:0,»index»:»elbaccesslogs_2016_10″,»node»:»5ttEmYcTTsie-z23OpKY0A»,»reason»:{«type»:»aggregation_execution_exception»,»reason»:» не удалось найти соответствующий контекст значения для выполнения агрегации [avg]»}}]},»статус»:500}

Похоже, причина в том, что «не удалось найти подходящий контекст значения для выполнения агрегации [avg]»… что я действительно не знаю, что происходит.

Кто-нибудь может что-нибудь предложить, пожалуйста? Или, если вам нужна дополнительная информация об этом, прежде чем отвечать, пожалуйста, дайте мне знать.

Спасибо,

Khurram

Ответ №1:

Я сам нашел решение, поэтому я объясняю ниже и закрываю проблему следующим образом:

В основном код

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