Рассчитайте максимальное количество параллельных элементов по времени в Elasticsearch.

Вопрос или проблема

Мне нужно рассчитать максимальное количество людей, проходящих опрос одновременно в Elastic Search.
Сопоставление для этих полей следующее:
"start_at": {"type": "date"}, "end_at": {"type": "date"},
Так что, для одной недели мне нужно знать с точностью ~10с, когда в нашей системе было максимальное количество людей и сколько из них 🙂

Спасибо за помощь 🙂

"aggs": { "seconds_histogram": { "date_histogram": { "field": "start_at", "fixed_interval": "1s", "min_doc_count": 0, "extended_bounds": { "min": ..., "max": ... } }, "aggs": { "active_surveys": { "bucket_script": { "buckets_path": { "start": "_key", "end": "_key" }, "script": """ // Опрос должен начаться до или в секунду ведра и закончиться после или в эту секунду. if (doc['start_at'].value.getMillis() <= params.start && doc['end_at'].value.getMillis() >= params.end) { return 1; } else { return 0; } """ } } } }

Ответ или решение

Для решения задачи по определению максимального количества одновременно проходящих опросов в Elasticsearch на основе предоставленного графика с полями "start_at" и "end_at", можно использовать агрегации и скрипты. Ваша цель – определить, в какой момент времени на протяжении недели было зарегистрировано максимальное количество активных опросов.

Шаги для достижения цели

  1. Настройка временного диапазона: Необходимо установить границы агрегации (параметры min и max для extended_bounds). В вашем случае это будет временной интервал в одну неделю. Убедитесь, что форматированиe дат соответствует формату, принятому в Elasticsearch.

  2. Использование date_histogram для разбивки по секундам: Агрегация date_histogram позволит разбить события на интервалы в 1 секунду. У вас уже задан параметр fixed_interval: "1s", который разбивает поверхность на секунды.

  3. Создание bucket_script для подсчета активных опросов: Используя bucket_script, вы сможете посчитать, сколько опросов были активны в каждом временном интервале. Скрипт будет проверять, если начальная дата опроса меньше или равна текущей метке времени и конечная дата больше или равна текущей метке времени.

Пример запроса

{
  "size": 0,
  "query": {
    "range": {
      "start_at": {
        "gte": "2023-10-01T00:00:00",
        "lt": "2023-10-08T00:00:00"
      }
    }
  },
  "aggs": {
    "seconds_histogram": {
      "date_histogram": {
        "field": "start_at",
        "fixed_interval": "1s",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "2023-10-01T00:00:00",
          "max": "2023-10-08T00:00:00"
        }
      },
      "aggs": {
        "active_surveys": {
          "bucket_script": {
            "buckets_path": {
              "start": "_key",
              "end": "_key"
            },
            "script": """
              int activeCount = 0;
              for (int i = 0; i < params._bucket_keys.length; i++) {
                def startTime = params._bucket_keys[i];
                def endTime = params._bucket_keys[i];

                if (doc['start_at'].value.getMillis() <= startTime && 
                    doc['end_at'].value.getMillis() >= endTime) {
                  activeCount++;
                }
              }
              return activeCount;
            """
          }
        }
      }
    }
  }
}

Интерпретация результатов

Этот запрос вернет количество активных опросов для каждой секунды в изучаемый период времени. Затем:

  1. Анализируйте результаты: Используйте результаты агрегации для поиска максимального числа активных опросов в возвращенном наборе данных.

  2. Формируйте вывод: Определите момент времени, в который наблюдалось максимальное количество активных опросов.

Дополнительные советы

  • Оптимизация производительности: Убедитесь, что ваши индексы оптимизированы и массив данных не слишком велик для оптимальной обработки.
  • Тестирование запроса: Перед запуском на реальных данных протестируйте запрос с менее объемными данными, чтобы убедиться в его работоспособности.

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

Оцените материал
Добавить комментарий

Капча загружается...