Mein aktueller Kampf besteht darin, eine Möglichkeit zu finden, die Aggregationen nach einer der berechneten Metriken zu sortieren. Wenn ich beispielsweise das folgende Dokument und meinen aktuellen Suchaufruf betrachte, möchte ich alle Aggregationen nach ihren Klicksummen sortieren.
Ich habe versucht, Bucket_sort innerhalb der inneren Aggs zu verwenden auf der Ebene back_to_parent, bekam aber die folgende Java-Ausnahme.
Code: Select all
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')
Code: Select all
{
id: '32ead132eq13w21',
statistics: {
clicks: 123,
views: 456
},
categories: [{ //nested type
name: 'color',
tags: [{ //nested type
slug: 'blue'
},{
slug: 'red'
}]
}]
}
Code: Select all
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' } }]
}
}
}
}
}
}
}
}
}
Es wäre auch schön zu verstehen, wie es möglich wäre, die Buckets nach a zu sortieren benutzerdefinierte Metrik, berechnet durch eine unkomplizierte scripted_metric. Ich habe den obigen Suchaufruf aktualisiert und ein Beispiel für eine benutzerdefinierte_Metrik hinzugefügt, durch die ich das Sortieren zulassen möchte.
Ich sehe, dass die direkte Verwendung von „bucket_sort“ nicht mit funktioniert Standardsortierarray, das wir für konkrete Felder verwenden. Das Folgende scheint die Dinge also nicht zu klären. Es funktioniert auch nicht für ein Sortierskript, da [bucket_sort] nur feldbasierte Sortierung unterstützt.
Code: Select all
by_tag_sort: {
bucket_sort: {
sort: [{ 'custom_metric.value': { order: 'desc' } }]
}
}