
Когда средние значения скрывают реальную картину, нужны более информативные метрики распределения. Одно лишь среднее может выглядеть «здоровым», но при этом маскировать замедления в длинном хвосте, перекошенные распределения значений или небольшую группу экстремальных выбросов, которые сильно влияют на пользовательский опыт и операционные риски. Теперь 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 даёт более глубокую статистическую видимость прямо внутри вашего рабочего процесса поисковой аналитики. Теперь вы можете отслеживать хвосты распределения, проверять пороговые значения и измерять устойчивый разброс в одном месте — не выгружая сырые данные во внешние системы.