Elasticsearch — выполнить максимальную агрегацию в нескольких полях

#elasticsearch #logstash #aggregation #elasticsearch-aggregation #elk

#elasticsearch #logstash #агрегирование #elasticsearch-агрегирование #elk

Вопрос:

У меня есть индекс, который содержит события из разных источников, поэтому у меня есть два разных имени для одного и того же поля: «accounting_date» и «dt_comptable«, и мне нужно запросить и получить максимальное из двух значений поля, следующий запрос сработал для меня для одного поля:

 GET indexXX/_search
{
  "size": 0,
  "aggs": {
    "latest_accounting_date": {
      "max": {
        "field": "dt_comptable"
      }
    }
  }
}  
  

Мне нужно включить другое поле «accounting_date«.

Комментарии:

1. Вам нужно получить максимальное количество двух полей для идентификатора документа?

2. @AssaelAzran нет, мне нужна максимальная дата между всеми документами, но с использованием двух полей, потому что в каждом документе есть одно из них

Ответ №1:

Введите сценарий… Вместо указания поля вы можете указать скрипт, который будет извлекать любое поле, какое бы оно ни присутствовало, но max агрегация сможет работать с ними обоими:

 GET indexXX/_search
{
  "size": 0,
  "aggs": {
    "latest_accounting_date": {
      "max": {
        "script": {
          "source": "doc['dt_comptable'].size() > 0 ? doc['dt_comptable'].value : doc['accounting_date'].value"
        }
      }
    }
  }
}  
  

Комментарии:

1. Спасибо за ваш ответ, вы дали мне хорошую наводку, я обновил ваш ответ, потому что у меня есть несколько документов без значений, это работает нормально, но я больше не могу получить значение в виде строки, вместо этого я получаю результат с таким же длинным типом: «агрегации»: { «latest_accounting_date»: { «значение»: 1.5943392E12 } }

2. Должно быть, раньше было то же самое, максимальная агрегация возвращает вам длинное значение самой последней даты, а не строку. Это длинное значение представляет собой количество миллисекунд, прошедших с момента начала эпохи, поэтому его легко преобразовать обратно в строку даты, если вам нужно.

3. Под строкой я подразумевал «value_as_string», которое я получаю при использовании simple max с полем: «aggregations»: { «latest_accounting_date» : { «value»: 1.5943392E12, «value_as_string»: «2020-07-10» } } Но, как вы сказали, я все равно могу преобразовать длинное значение в дату, так что большое вам спасибо