【发布时间】:2021-05-23 10:34:42
【问题描述】:
我目前正在通过一个多级嵌套字段聚合一个集合,并从这个集合中计算一些子聚合指标,这正在使用弹性搜索的反向嵌套功能,如 Sub-aggregate a multi-level nested composite aggregation 所述。
我目前的努力是找到一种方法来按计算的指标之一对聚合进行排序。例如,考虑到以下文档和我当前的搜索调用,我想按点击总和对所有聚合进行排序。
我尝试在back_to_parent 级别的内部aggs 中使用bucket_sort,但得到以下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' } }]
}
}
}
}
}
}
}
}
}
更新:
如果了解如何通过通过无痛scripted_metric 计算的自定义指标对存储桶进行排序,也将是一件好事。我更新了上面的搜索调用,添加了一个示例custom_metric,我希望允许对其进行排序。
我发现直接使用bucket_sort 不适用于我们用于具体字段的标准排序数组。所以下面似乎没有对事情进行排序。它也不适用于排序脚本,因为[bucket_sort] only supports field based sorting。
by_tag_sort: {
bucket_sort: {
sort: [{ 'custom_metric.value': { order: 'desc' } }]
}
}
【问题讨论】:
标签: elasticsearch elasticsearch-aggregation