Составная агрегация с отсортированными данными

#elasticsearch

#elasticsearch

Вопрос:

Я пытаюсь получить сгруппированные данные с помощью составной агрегации.

Поле группировки — «fromNumber». Я хочу сгруппировать (по «fromNumber») записи вызовов по убыванию (по «callStartStamp»).

Допустим, у меня есть 400 записей, и учитывая эти записи;

  1. fromNumber=0212 123…. callStartStamp=»2020-09-09T08:14:38″
  2. fromNumber=0312 312…. callStartStamp=»2020-09-09T08:10:38″
  3. fromNumber=0502 313…. callStartStamp=»2020-09-10T08:10:38″

Когда я запускаю приведенный ниже код, я ожидаю получить данные в порядке 3, 1, 2 и так далее.

Когда я даю размер корзины 20, я не могу получить 3. record, потому что он получает данные, отсортированные по возрастанию (по ключу). Он возвращает 1, 2 .. и так далее. Поскольку 1. и 2. записи имеют «fromNumber», начинающийся с «02» и «03. 3. Записи начинаются с «05».

Таким образом, очередь (по возрастанию) не доходит до 3. запишите, чтобы получить сгруппированные данные (из-за размера 20).

Если я задам размер корзины 300, 3. данные также поступают, потому что они достигают данных по возрастанию (по ключу).

Итак, я попытался упорядочить данные по убыванию с помощью «callStartStamp» перед агрегацией. Но это не работает.

 {
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "firmId": {
              "value": 8525,
              "boost": 1
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "sort": [
    {
      "callStartStamp": {
        "order": "desc"
      }
    }
  ],
  "aggregations": {
    "fromNumberAgg": {
      "composite": {
        "size":  20,
        "sources": [
          {
            "byFromNumber": {
              "terms": {
                "field": "fromNumber",
                "missing_bucket": false,
                "order": "asc"
              }
            }
          }
        ],
        "after": {
          "byFromNumber": ""
        }
      },
      "aggregations": {
        "hits": {
          "top_hits": {
            "from": 0,
            "size": 1000,
            "version": false,
            "seq_no_primary_term": false,
            "explain": false,
            "sort": [
              {
                "callStartStamp": {
                  "order": "desc"
                }
              }
            ]
          }
        },
        "lastCallStart": {
          "max": {
            "field": "callStartStamp"
          }
        },
        "sortByCallStart": {
          "bucket_sort": {
            "sort": [
              {
                "lastCallStart": {
                  "order": "desc"
                }
              }
            ],
            "from": 0,
            "gap_policy": "SKIP"
          }
        }
      }
    }
  }
}