当平均值掩盖了真实情况时,你需要更好的分布指标。单一的均值看上去可能很“健康”,却仍然可能掩盖长尾的性能下降、偏斜的取值分布,或者少数严重影响用户体验和运营风险的极端离群值。
现在 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 让你在搜索分析工作流内部就获得更强的统计可见性。
现在你可以在同一个地方监控尾部、评估阈值并测量稳健的离散程度,而无需先把原始数据导出到外部系统。
