⚠️ 此页面为自动翻译,翻译可能不完美。
blog-post

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

View as markdown

当平均值掩盖了真实情况时,你需要更好的分布指标。单一的均值看上去可能很“健康”,却仍然可能掩盖长尾的性能下降、偏斜的取值分布,或者少数严重影响用户体验和运营风险的极端离群值。
现在 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 示例

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 衡量抖动。

  • 电商定价:检测定价分布的变化和异常的离散程度。

  • 欺诈与异常检测:将中位数行为与基于 MAD 的偏差进行对比。

  • SLO 报告:将百分位排名与业务阈值结合(例如“低于 200ms 的占比”)。

  • 当你需要临界值时使用 percentiles(p95 = ?)。

  • 当你需要百分比时使用 percentile_ranks(<=200ms = ?)。

  • 当离群值很常见、需要稳健的离散度度量时使用 MAD。

  • 从默认的 compression=200 开始;如果需要更高精度再增大它。


总结

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

安装Manticore Search

在 Linux 或 macOS 上用一条命令安装 Manticore Search:

curl https://manticoresearch.com | sh

有关高级安装选项,请参阅完整安装指南 和手册 。

安装Manticore Search