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