Внутренняя агрегация получение последней даты на уровне массива

#elasticsearch

Вопрос:

Я пытался написать сложный запрос, и это берет надо мной верх.
Допустим, у меня есть 3 таких документа:

 Doc #1:
{
  "database_backups" : [
    {
      "Date" : "2021-09-03",
      "Name" : "EventsAPI",
      "Type" : "Full"
    },
    {
      "Date" : "2021-09-04",
      "Name" : "EventsAPI",
      "Type" : "Diff"
    },
    {
      "Date" : "2021-09-05",
      "Name" : "EventsAPI",
      "Type" : "Log"
    }
  ]
}
Doc #2:
{
  "database_backups" : [
    {
      "Date" : "2021-09-01",
      "Name" : "EventsAPI",
      "Type" : "Full"
    }
  ]
}
Doc #3:
{
  "database_backups" : [
    {
      "Date" : "2021-09-02",
      "Name" : "EventsAPI",
      "Type" : "Diff"
    },
    {
      "Date" : "2021-09-01",
      "Name" : "EventsSecurity",
      "Type" : "Diff"
    }
  ]
}
 

Я хочу получить последние резервные копии каждого уникального имени типа. Поэтому в результате мне понадобится Имя Тип Дата.

Я попробовал composite agg связать Имя тип, и это сработало.

Однако, когда я также пытаюсь добавить max agg на дату, он выбирает максимальную дату всего документа, а не конкретный объект, который соответствует имени Типу в массиве.

Так, например, максимальная дата EventsAPI Diff agg будет «2021-09-05», потому что это максимальная дата в документе № 1, но это дата для журнала EventsAPI , а не для EventsAPI Diff.

Можно ли получить последнюю дату ключа Name Type для этого конкретного объекта в массиве?
Результат, который я ищу, должен каким-то образом дать эту информацию:

 EventsSecurity   Diff   "2021-09-01"
EventsAPI   Full   "2021-09-03"
EventsAPI   Diff   "2021-09-04"
EventsAPI   Log    "2021-09-05"
 

Ответ №1:

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

агрегирование терминов можно использовать для получения максимальной даты для каждого события и типа

Запрос

 {
  "size": 0,
  "aggs": {
    "NAME": {
      "nested": {
        "path": "database_backups"
      },
      "aggs": {
        "NAME": {
          "terms": {
            "field": "database_backups.Name.keyword",
            "size": 10
          },
          "aggs": {
            "NAME": {
              "terms": {
                "field": "database_backups.Type.keyword",
                "size": 10
              },
              "aggs": {
                "NAME": {
                  "max": {
                    "field": "database_backups.Date"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
 

Результат

 "aggregations" : {
    "NAME" : {
      "doc_count" : 6,
      "NAME" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : "EventsAPI",
            "doc_count" : 5,
            "NAME" : {
              "doc_count_error_upper_bound" : 0,
              "sum_other_doc_count" : 0,
              "buckets" : [
                {
                  "key" : "Diff",
                  "doc_count" : 2,
                  "NAME" : {
                    "value" : 1.6307136E12,
                    "value_as_string" : "2021-09-04T00:00:00.000Z"
                  }
                },
                {
                  "key" : "Full",
                  "doc_count" : 2,
                  "NAME" : {
                    "value" : 1.6306272E12,
                    "value_as_string" : "2021-09-03T00:00:00.000Z"
                  }
                },
                {
                  "key" : "Log",
                  "doc_count" : 1,
                  "NAME" : {
                    "value" : 1.6308E12,
                    "value_as_string" : "2021-09-05T00:00:00.000Z"
                  }
                }
              ]
            }
          },
          {
            "key" : "EventsSecurity",
            "doc_count" : 1,
            "NAME" : {
              "doc_count_error_upper_bound" : 0,
              "sum_other_doc_count" : 0,
              "buckets" : [
                {
                  "key" : "Diff",
                  "doc_count" : 1,
                  "NAME" : {
                    "value" : 1.6304544E12,
                    "value_as_string" : "2021-09-01T00:00:00.000Z"
                  }
                }
              ]
            }
          }
        ]
      }
    }
  }