Когда средние значения скрывают реальную картину, нужны более информативные метрики распределения. Одно лишь среднее может выглядеть «здоровым», но при этом маскировать замедления в длинном хвосте, перекошенные распределения значений или небольшую группу экстремальных выбросов, которые сильно влияют на пользовательский опыт и операционные риски.
Теперь Manticore Search поддерживает агрегации перцентилей, перцентильных рангов и MAD (медианного абсолютного отклонения), так что вы можете анализировать разброс, хвосты и выбросы прямо в поисковых запросах.
Они особенно полезны для мониторинга задержек, анализа цен, поведения пользователей и любых задач, где «среднего» недостаточно.
percentiles(field[, {values='...',compression=N}])
Возвращает оценочные значения перцентилей (например, p50, p95, p99)percentile_ranks(field, {values='...',compression=N})
Возвращает оценочную долю документов со значениями, меньшими или равными каждому заданному значениюmedian_absolute_deviation(field[, {compression=N}])
Возвращает оценочное значение MAD — устойчивую (робастную) меру разброса вокруг медианы
Эти функции по своей природе приближённые, что удерживает потребление памяти в заданных пределах и делает производительность предсказуемой, а необязательный параметр compression управляет компромиссом между точностью и памятью: меньшие значения работают быстрее и легче по памяти, но могут давать большую погрешность; значение по умолчанию — 200.
Использование
Manticore Search поддерживает два варианта синтаксиса для этих агрегаций: SQL и JSON API.
Пример на SQL
SELECT
percentiles(latency) AS p_default,
percentiles(latency, {values='5,50,95',compression=200}) AS p_custom,
percentile_ranks(latency, {values='10,150,1500',compression=200}) AS r_custom,
median_absolute_deviation(latency, {compression=200}) AS mad
FROM agg_td\G
*************************** 1. row ***************************
p_default: {"1":10,"5":10,"25":20,"50":30,"75":40,"95":50,"99":50}
p_custom: {"5":10,"50":30,"95":50}
r_custom: {"10":20,"150":100,"1500":100}
mad: {"value":10,"value_as_string":"10"}
Как это читать
p_customдаёт прямые пороги перцентилей (например, задержку p95).r_customпоказывает долю документов ниже заданных порогов.madпоказывает, насколько плотно значения сгруппированы вокруг медианы.
Пример HTTP JSON
POST /json/search
{
"table": "agg_td",
"size": 0,
"aggs": {
"latency_percentiles": {
"percentiles": {
"field": "latency",
"values": [5, 50, 95],
"keyed": true
}
},
"latency_ranks": {
"percentile_ranks": {
"field": "latency",
"values": [10, 150, 1500],
"keyed": true
}
},
"latency_mad": {
"median_absolute_deviation": {
"field": "latency",
"tdigest": {
"compression": 200
}
}
}
}
}
{
"took": 0,
"timed_out": false,
"aggregations": {
"latency_percentiles": {
"values": {
"5.0": 10,
"50.0": 30,
"95.0": 50
}
},
"latency_ranks": {
"values": {
"10.0": 20,
"150.0": 100,
"1500.0": 100
}
},
"latency_mad": {
"value": 10,
"value_as_string": "10"
}
},
"hits": {
"total": 5,
"hits": []
}
}
Практические сценарии и советы
Производительность поиска/API: отслеживайте задержки p50/p95/p99 и MAD для оценки джиттера.
Ценообразование в e-commerce: выявляйте сдвиги в распределении цен и аномальный разброс.
Выявление мошенничества и аномалий: сравнивайте медианное поведение с отклонениями на основе MAD.
Отчётность по SLO: сочетайте перцентильные ранги с бизнес-порогами (например, «% запросов быстрее 200 мс»).
Используйте percentiles, когда нужны пороговые значения (
p95 = ?).Используйте percentile_ranks, когда нужны проценты (
<=200ms = ?).Используйте MAD, когда выбросы — обычное дело и нужна устойчивая мера разброса.
Начинайте со значения по умолчанию
compression=200; увеличивайте его, если нужна более высокая точность.
Итог
С агрегациями перцентилей и MAD Manticore Search даёт более глубокую статистическую видимость прямо внутри вашего рабочего процесса поисковой аналитики.
Теперь вы можете отслеживать хвосты распределения, проверять пороговые значения и измерять устойчивый разброс в одном месте — не выгружая сырые данные во внешние системы.
