Elasticsearch: как использовать несколько фильтров и вычислений в агрегациях?

#php #elasticsearch #kibana

#php #elasticsearch #kibana

Вопрос:

Я пытаюсь выполнить функцию на kibana. У меня есть индекс с заказами с некоторыми полями: datetime1 , datetime2 с форматом : yyyy-MM-dd HH:mm

Сначала я должен проверить datetime1 , существует ли он. Во-вторых, я должен проверить разницу между этими 2 датами datetime2 - datetime1 , чтобы закончить, я должен поместить результат в разные значения, если разница:

  • менее 24 часов
  • между 24 и 48 часами
  • 48 — 72
  • ….

Что я пробовал :

 GET orders/_search
{
  "size": 0,
  "aggs": {
    "test1": {
      "filters": {
        "filters": {
          "exist_datetime1": {
            "exists": {
              "field": "datetime1"
            }
          },
          "24_hours": {
            "script": {
              "script": {
                "source": "doc['datetime2'].value - doc['datetime1'].value < 24",
                "lang": "painless"
              }
            }
          }
        }
      }
    }
  }
}
  

Как я могу выполнить несколько фильтров и выполнить вычитание между датами?
Спасибо за вашу помощь 🙂

Ответ №1:

Это хорошее начало, однако, я думаю, вам нужно что-то немного другое. Вот попытка предоставить нужные вам диапазоны, используя range агрегацию, поддерживаемую вашим скриптом.

Вам нужно убедиться, что оба поля даты имеют значения ( query часть), а затем вы можете определить нужные вам сегменты ( < 24h , 24h - 48h , и т.д.)

 {
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "exists": {
            "field": "datetime1"
          }
        },
        {
          "exists": {
            "field": "datetime2"
          }
        }
      ]
    }
  },
  "aggs": {
    "ranges": {
      "range": {
        "script": {
          "lang": "painless",
          "source": "(doc['datetime2'].value.millis - doc['datetime1'].value.millis) / 3600000"
        },
        "ranges": [
          {
            "to": 24,
            "key": "< 24h"
          },
          {
            "from": 24,
            "to": 48,
            "key": "24h-48h"
          },
          {
            "from": 48,
            "key": "> 48h"
          }
        ]
      }
    }
  }
}
  

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

1. Спасибо за ответ, он работает очень хорошо! Итак, чтобы использовать filter, лучше использовать их в запросе вместо agg?

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