В настоящее время я агрегирую коллекцию с помощью многоуровневого вложенного поля и вычисляю некоторые показатели субагрегации из этой коллекции, и это работает с использованием функции обратной вложенности elasticsearch, как описано в разделе «Подагрегирование многоуровневой вложенной составной агрегации».< /p>
Моя текущая задача — найти способ сортировки агрегатов по одной из вычисляемых метрик. Например, учитывая следующий документ и мой текущий поисковый вызов, я хотел бы отсортировать все агрегаты по сумме кликов.
Я пробовал использовать Bucket_sort внутри внутренних агрегатов. на уровне back_to_parent, но получил следующее исключение Java.
class org.elasticsearch.search.aggregations.bucket.nested.InternalReverseNested cannot be cast to class org.elasticsearch.search.aggregations.InternalMultiBucketAggregation
(org.elasticsearch.search.aggregations.bucket.nested.InternalReverseNested and org.elasticsearch.search.aggregations.InternalMultiBucketAggregation are in unnamed module of loader 'app')
{
id: '32ead132eq13w21',
statistics: {
clicks: 123,
views: 456
},
categories: [{ //nested type
name: 'color',
tags: [{ //nested type
slug: 'blue'
},{
slug: 'red'
}]
}]
}
GET /acounts-123321/_search
{
size: 0,
aggs: {
categories_parent: {
nested: {
path: 'categories.tags'
},
aggs: {
filtered: {
filter: {
term: { 'categories.tags.category': 'color' }
},
aggs: {
by_slug: {
terms: {
field: 'categories.tags.slug',
size: perPage
},
aggs: {
back_to_parent: {
reverse_nested: {},
aggs: {
clicks: {
sum: {
field: 'statistics.clicks'
}
},
custom_metric: {
scripted_metric: {
init_script: 'state.accounts = []',
map_script: 'state.accounts.add(new HashMap(params["_source"]))',
combine_script: 'double result = 0;
for (acc in state.accounts) {
result += ( acc.statistics.clicks + acc.statistics.impressions);
}
return result;',
reduce_script: 'double sum = 0;
for (state in states) {
sum += state;
}
return sum;'
}
},
by_tag_sort: {
bucket_sort: {
sort: [{ 'clicks.value': { order: 'desc' } }]
}
}
}
}
}
}
}
}
}
Обновление:
Также было бы неплохо понять, как можно сортировать сегменты по специальная метрика, рассчитываемая с помощью скриптовой_метрики. Я обновил вызов поиска выше, добавив образец custom_metric, по которому я хочу разрешить сортировку.
Я вижу, что использование Bucket_sort напрямую не работает с стандартный массив сортировки, который мы используем для конкретных полей. Итак, следующее, похоже, не сортирует вещи. Это также не будет работать для сценария сортировки, поскольку [bucket_sort] поддерживает только сортировку по полям.
by_tag_sort: {
bucket_sort: {
sort: [{ 'custom_metric.value': { order: 'desc' } }]
}
}
Подробнее здесь: https://stackoverflow.com/questions/662 ... ggregation
Сортировка обратной вложенности обратно в родительскую агрегацию ⇐ Elasticsearch aggregation
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение