Многоэтапное агрегирование времени в ElasticSearch - данные сеанса для подсчета пользователей - PullRequest
0 голосов
/ 15 февраля 2019

Имея набор данных с данными сеанса пользователя, например:

{'username':'TestUser',
 'sessionStartTime' : '2019-02-14 09:00:00'
 'sessionEndTime' : ''2019-02-14 10:20:00'},
{'username':'User2',
 'sessionStartTime' : '2019-02-14 02:00:00'
 'sessionEndTime' : ''2019-02-14 12:00:00'}

Существует ли простой способ запроса эластичности для агрегированной суммы нескольких сеансов за период времени?

Итакв основном я хочу запросить диапазон времени с 09:00:00 до 11:00:00 и получить агрегированный почасовой результат, подобный следующему:

{'bucketStart' : '2019-02-14 09:00:00',
'bucketEnd' : '2019-02-14 10:00:00',
'sessioncount' : 2},
{'bucketStart' : '2019-02-14 10:00:00',
'bucketEnd' : '2019-02-14 11:00:00',
'sessioncount' : 1}

Цель этого состоит в том, чтобы использовать полученные данные для рисованиялинейный график для количества онлайн-сеансов пользователей, имеющих только данные сеанса в базе данных.

1 Ответ

0 голосов
/ 19 февраля 2019

Хорошо, я сделал это на своей дате (день за днем), поэтому настройте 360000 * 24 (число мс в интервале date_histogram, день для меня).

Второе, что вы можете сделать, этосократить вашу дату на час (я имею в виду 14:03 => 14:00, 12:37 => 12 ч и т. д., округляя время до конца и вниз до времени начала)

Я неPro безболезненно, поэтому я сохраняю агг результат в предопределенном массиве (размер 99), может быть, мы можем сделать это с помощью списка чего-то динамического.В любом случае, если ваша сессия может длиться более 99 часов, настройте ее.

Сценарий создает массив агг по дням, разбивая час за часом даты.

{
    "query": {
         // your filter query
    },
    "aggs": {
    "active_alerts": {
      "date_histogram": {
        "interval": "day",
        "script": {
            "inline": "def currentDate=(doc['sessionStartTime'].value); def endDate=(doc['sessionEndTime'].value); def combined=[99]; def counter = 0; while ((currentDate < endDate) && (counter < 99)) { combined[counter] = currentDate; currentDate += 3600000 * 24 } return combined",
            "lang":"painless"
        }
      }
    }
  }
}

Надеюсь, это поможет, пустья знаю;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...