Вам нужно будет использовать Bucket Sort Aggregation
для варианта использования, который вы ищете.
Ниже приведены примеры документов, реализованный мной запрос агрегации и ответ:
Документы:
POST myaggregation/_doc/1
{
"key": "1001",
"offers":[
{
"savper": 1000
},
{
"savper": 2000
}
],
"sum_score": 1
}
POST myaggregation/_doc/2
{
"key": "1001",
"offers":[
{
"savper": 3000
},
{
"savper": 4000
}
],
"sum_score": 2
}
POST myaggregation/_doc/3
{
"key": "1002",
"offers":[
{
"savper": 1000
},
{
"savper": 2000
}
],
"sum_score": 2
}
POST myaggregation/_doc/4
{
"key": "1002",
"offers":[
{
"savper": 3000
},
{
"savper": 4000
}
],
"sum_score": 4
}
Запрос агрегации:
POST myaggregation/_search
{
"size": 0,
"aggs": {
"myaggs": {
"terms": {
"field": "key",
"size": 10
},
"aggs": {
"mynested": {
"nested": {
"path": "offers"
},
"aggs": {
"found_savper": {
"max": {
"field": "offers.savper"
}
}
}
},
"maxima":{
"max": {
"field": "sum_score"
}
},
"sort": {
"bucket_sort": {
"sort": [
{ "maxima": { "order": "desc" }}
]
}
}
}
}
}
}
Обратите внимание, что порядок сортировки при агрегировании maxima
равен desc
. Вы можете изменить его на asc
в зависимости от вашего варианта использования.
Ответ агрегации:
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"myaggs" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "1002",
"doc_count" : 2,
"maxima" : {
"value" : 4.0
},
"mynested" : {
"doc_count" : 4,
"found_savper" : {
"value" : 4000.0
}
}
},
{
"key" : "1001",
"doc_count" : 2,
"maxima" : {
"value" : 2.0
},
"mynested" : {
"doc_count" : 4,
"found_savper" : {
"value" : 4000.0
}
}
}
]
}
}
}
Если вы удалите логику агрегации сортировки сегментов, вы заметите, что агрегация будет отсортирована по key
.
Надеюсь, это поможет!