Я использую эластичный поиск с 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*))
Я думал о создании некоторой пустой верхней агрегации, а затем добавлял все агрегации как субагрегации, но это кажется глупым обходом, и я что-то не правильно понимаю.
Есть идеи?