如何根据子聚合对复合聚合进行排序?下面是查询
How to sort a composite aggregation on the basis of a sub aggregation ? Below is the query
GET myIndex/_search
{
"from": 0,
"size": 0,
"query": {
"bool": {
"must": [
{
"term": {
"user_id": {
"value": "a88604b0",
"boost": 1
}
}
},
{
"term": {
"entity_status.keyword": {
"value": "ACTIVE",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"sort": [
{
"txn_date": {
"order": "desc"
}
}
],
"aggs": {
"my_buckets": {
"composite": {
"sources": [
{
"group_by": {
"terms": {
"field": "category"
}
}
}
]
},
"aggs": {
"total_amount": {
"sum": {
"field": "amount"
}
}
}
}
}
}
我正在执行上面的查询,但我希望聚合按子聚合排序
total_amount
降序排列。任何修改或其他方式来实现这一目标?
这是上面查询的结果。
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 4,
"successful" : 4,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 22,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"my_buckets" : {
"after_key" : {
"group_by" : "Travel"
},
"buckets" : [
{
"key" : {
"group_by" : "Bills"
},
"doc_count" : 2,
"total_amount" : {
"value" : 86710.44
}
},
{
"key" : {
"group_by" : "Grocery"
},
"doc_count" : 1,
"total_amount" : {
"value" : 43355.22
}
},
{
"key" : {
"group_by" : "Fashion"
},
"doc_count" : 5,
"total_amount" : {
"value" : 216776.1
}
},
{
"key" : {
"group_by" : "Recharge"
},
"doc_count" : 7,
"total_amount" : {
"value" : 303486.54
}
},
{
"key" : {
"group_by" : "Shopping"
},
"doc_count" : 2,
"total_amount" : {
"value" : 86710.44
}
},
{
"key" : {
"group_by" : "Travel"
},
"doc_count" : 5,
"total_amount" : {
"value" : 216776.1
}
}
]
}
}
}
我希望聚合按照 total_amount
排序。
遗憾的是,目前无法做到这一点。每个来源都可以按升序或降序排列,但仅此而已。
通过子聚合进行排序需要收集所有复合键并计算每个桶的总量,这在内存方面会非常昂贵,并且与复合聚合试图实现的目标正好相反,即一种以非常低的内存占用量对桶进行分页的方法
另请注意,如果您的类别基数较低 (<1000),则您实际上并不需要复合聚合,您可以使用 terms
聚合来实现所需的功能,如下所示:
{
...
"aggs": {
"group_by": {
"terms": {
"field": "category",
"size": 100,
"order": {
"total_amount": "desc"
}
},
"aggs": {
"total_amount": {
"sum": {
"field": "amount"
}
}
}
}
}
}
GET myIndex/_search
{
"from": 0,
"size": 0,
"query": {
"bool": {
"must": [
{
"term": {
"user_id": {
"value": "a88604b0",
"boost": 1
}
}
},
{
"term": {
"entity_status.keyword": {
"value": "ACTIVE",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"sort": [
{
"txn_date": {
"order": "desc"
}
}
],
"aggs": {
"my_buckets": {
"composite": {
"sources": [
{
"group_by": {
"terms": {
"field": "category"
}
}
}
]
},
"aggs": {
"total_amount": {
"sum": {
"field": "amount"
}
}
}
}
}
}
我正在执行上面的查询,但我希望聚合按子聚合排序
total_amount
降序排列。任何修改或其他方式来实现这一目标?
这是上面查询的结果。
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 4,
"successful" : 4,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 22,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"my_buckets" : {
"after_key" : {
"group_by" : "Travel"
},
"buckets" : [
{
"key" : {
"group_by" : "Bills"
},
"doc_count" : 2,
"total_amount" : {
"value" : 86710.44
}
},
{
"key" : {
"group_by" : "Grocery"
},
"doc_count" : 1,
"total_amount" : {
"value" : 43355.22
}
},
{
"key" : {
"group_by" : "Fashion"
},
"doc_count" : 5,
"total_amount" : {
"value" : 216776.1
}
},
{
"key" : {
"group_by" : "Recharge"
},
"doc_count" : 7,
"total_amount" : {
"value" : 303486.54
}
},
{
"key" : {
"group_by" : "Shopping"
},
"doc_count" : 2,
"total_amount" : {
"value" : 86710.44
}
},
{
"key" : {
"group_by" : "Travel"
},
"doc_count" : 5,
"total_amount" : {
"value" : 216776.1
}
}
]
}
}
}
我希望聚合按照 total_amount
排序。
遗憾的是,目前无法做到这一点。每个来源都可以按升序或降序排列,但仅此而已。
通过子聚合进行排序需要收集所有复合键并计算每个桶的总量,这在内存方面会非常昂贵,并且与复合聚合试图实现的目标正好相反,即一种以非常低的内存占用量对桶进行分页的方法
另请注意,如果您的类别基数较低 (<1000),则您实际上并不需要复合聚合,您可以使用 terms
聚合来实现所需的功能,如下所示:
{
...
"aggs": {
"group_by": {
"terms": {
"field": "category",
"size": 100,
"order": {
"total_amount": "desc"
}
},
"aggs": {
"total_amount": {
"sum": {
"field": "amount"
}
}
}
}
}
}