Как отсортировать составную агрегацию на основе субагрегации? Ниже запрос - PullRequest
0 голосов
/ 29 мая 2020

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.

1 Ответ

1 голос
/ 29 мая 2020

К сожалению, сейчас это невозможно. Каждый источник можно упорядочить в порядке возрастания или убывания, но это почти все.

Заказ по субагрегации потребовал бы сбора всех составных ключей и вычисления общей суммы для каждого сегмента, что было бы очень дорого. с точки зрения памяти и в точности противоположное тому, что пытается достичь составная агрегация, то есть способ разбивки на страницы по сегментам с очень малым объемом памяти

Также обратите внимание, что если у вас низкая мощность категорий (<1000 ), вам действительно не нужна составная агрегация, вы можете добиться того, что вам нужно, с агрегацией <code>terms, например:

{
  ...
  "aggs": {
    "group_by": {
      "terms": {
        "field": "category",
        "size": 100,
        "order": {
          "total_amount": "desc"
        }
      },
      "aggs": {
        "total_amount": {
          "sum": {
            "field": "amount"
          }
        }
      }
    }
  }
}
...