#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"
}
}
]
}
}
]
}
}
}