---
title: "Manticore Search 新增百分位数与中位数绝对偏差聚合"
description: "Manticore Search 全新的百分位数与 MAD 聚合：如何在 SQL 和 JSON 中分析分布尾部行为与离群值，并通过 compression 调节精度。"
date: 2026-10-06
author: "Nick Sergeev"
image: https://manticoresearch.com/images/blog/percentile-aggrs.png
lang: zh
url: https://manticoresearch.com/zh/blog/percentile-aggrs-blogpost/
translations:
  en: https://manticoresearch.com/blog/percentile-aggrs-blogpost/
  ru: https://manticoresearch.com/ru/blog/percentile-aggrs-blogpost/
---

# Manticore Search 新增百分位数与中位数绝对偏差聚合

Manticore Search 全新的百分位数与 MAD 聚合：如何在 SQL 和 JSON 中分析分布尾部行为与离群值，并通过 compression 调节精度。

当平均值掩盖了真实情况时，你需要更好的分布指标。单一的均值看上去可能很“健康”，却仍然可能掩盖长尾的性能下降、偏斜的取值分布，或者少数严重影响用户体验和运营风险的极端离群值。
现在 Manticore Search 支持 **百分位数（percentile）**、**百分位排名（percentile ranks）** 和 **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 衡量抖动。
- **电商定价**：检测定价分布的变化和异常的离散程度。
- **欺诈与异常检测**：将中位数行为与基于 MAD 的偏差进行对比。
- **SLO 报告**：将百分位排名与业务阈值结合（例如“低于 200ms 的占比”）。


- 当你需要临界值时使用 **percentiles**（`p95 = ?`）。
- 当你需要百分比时使用 **percentile_ranks**（`<=200ms = ?`）。
- 当离群值很常见、需要稳健的离散度度量时使用 **MAD**。
- 从默认的 `compression=200` 开始；如果需要更高精度再增大它。

---

### 总结

借助百分位数与 MAD 聚合，Manticore Search 让你在搜索分析工作流内部就获得更强的统计可见性。
现在你可以在同一个地方监控尾部、评估阈值并测量稳健的离散程度，而无需先把原始数据导出到外部系统。
