---
title: "Новые агрегации перцентилей и медианного абсолютного отклонения в Manticore Search"
description: "Новые агрегации перцентилей и MAD в Manticore Search: как анализировать поведение хвостов распределения и выбросы в SQL и JSON с настраиваемой точностью через compression."
date: 2026-10-06
author: "Nick Sergeev"
image: https://manticoresearch.com/images/blog/percentile-aggrs.png
lang: ru
url: https://manticoresearch.com/ru/blog/percentile-aggrs-blogpost/
translations:
  en: https://manticoresearch.com/blog/percentile-aggrs-blogpost/
  zh: https://manticoresearch.com/zh/blog/percentile-aggrs-blogpost/
---

# Новые агрегации перцентилей и медианного абсолютного отклонения в Manticore Search

Новые агрегации перцентилей и MAD в Manticore Search: как анализировать поведение хвостов распределения и выбросы в SQL и JSON с настраиваемой точностью через compression.

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

```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
```

```sql
*************************** 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

```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
        }
      }
    }
  }
}
```

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