Вопрос или проблема
Мне нужно рассчитать максимальное количество людей, проходящих опрос одновременно в 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", можно использовать агрегации и скрипты. Ваша цель – определить, в какой момент времени на протяжении недели было зарегистрировано максимальное количество активных опросов.
Шаги для достижения цели
-
Настройка временного диапазона: Необходимо установить границы агрегации (параметры
min
иmax
дляextended_bounds
). В вашем случае это будет временной интервал в одну неделю. Убедитесь, что форматированиe дат соответствует формату, принятому в Elasticsearch. -
Использование
date_histogram
для разбивки по секундам: Агрегацияdate_histogram
позволит разбить события на интервалы в 1 секунду. У вас уже задан параметрfixed_interval: "1s"
, который разбивает поверхность на секунды. -
Создание
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;
"""
}
}
}
}
}
}
Интерпретация результатов
Этот запрос вернет количество активных опросов для каждой секунды в изучаемый период времени. Затем:
-
Анализируйте результаты: Используйте результаты агрегации для поиска максимального числа активных опросов в возвращенном наборе данных.
-
Формируйте вывод: Определите момент времени, в который наблюдалось максимальное количество активных опросов.
Дополнительные советы
- Оптимизация производительности: Убедитесь, что ваши индексы оптимизированы и массив данных не слишком велик для оптимальной обработки.
- Тестирование запроса: Перед запуском на реальных данных протестируйте запрос с менее объемными данными, чтобы убедиться в его работоспособности.
Этот подход позволит вам с высокой степенью точности определять максимальное количество одновременно проходящих опросов, что может быть полезно для анализа и оптимизации работы вашей системы.