Elasticsearch java api получает средние показатели агрегации - PullRequest
0 голосов
/ 06 ноября 2018

Я использую эластичный поиск с Java API, и я пытаюсь получить среднее значение самой низкой записи из каждого сегмента агрегации терминов. Одно решение, которое я нашел, состоит в том, чтобы получить результаты, подобные этому

AggregationBuilders.terms("group_by_flights").field("flight_id)
    .subAggregation(AggregationBuilders.min("minimum").field("duration")))

, а затем подсчитать среднее значение на стороне кода. Проблема в том, что если будет много результатов, он выделит много памяти для его подсчета. Я хотел бы сделать это на эластичной стороне. Я обнаружил, что есть что-то вроде агрегации конвейера bug avg, которую можно добавить как sibling агрегат к терминам (и другим)

"the average": {
  "avg_bucket": {
    "buckets_path": "some_bucket_path" 
  }
}

Проблема в том, что в java api вы можете добавить агрегацию конвейеров только как subaggregation . Поэтому, если мы построим нашу агрегацию таким образом, наша агрегация терминов не будет видна

AggregationBuilders.terms("group_by_flights").field("flight_id")
    .subAggregation(PipelineAggregatorBuilders.avgBucket("avg", "group_by_flights.duration" *<- this wont't be seen because its subaggregation*))

Я думал о создании некоторой пустой верхней агрегации, а затем добавлял все агрегации как субагрегации, но это кажется глупым обходом, и я что-то не правильно понимаю. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Мое решение - использовать FilterAggregationBuilder, чтобы сделать это, это может фильтровать данные. Первая субагрегация для создания сегмента данных, вторая субагрегация для объединения данных сегмента.

AggregationBuilders.filter("global_aggregation", bool)
    .subAggregation((AggregationBuilders.terms("group_by_flights").field("flight_id"))
    .subAggregation(AggregationBuilders.min("min").field("duration")))
    .subAggregation(PipelineAggregatorBuilders.avgBucket("avg_bucket_aggs", "group_by_flights>min"));
0 голосов
/ 06 ноября 2018

Единственное решение, которое я нашел до сих пор, состоит в том, чтобы сделать агрегирование как субагрегацию "пустой агрегации"

AggregationBuilders.global("global_aggregation")
    .subAggregation((AggregationBuilders.terms("group_by_flights").field("flight_id"))
        .subAggregation(AggregationBuilders.min("min").field("duration")))
    .subAggregation(PipelineAggregatorBuilders.avgBucket("avg_bucket_aggs","group_by_flights>min"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...