百分位桶聚合
percentiles_bucket
聚合是一个同级聚合,用于计算分桶指标的百分位位置。
percentiles_bucket
聚合精确计算百分位,不进行近似或插值。每个百分位都作为小于或等于目标百分位的最接近值返回。
percentiles_bucket
聚合要求将整个值列表临时保留在内存中,即使对于大型数据集也是如此。相比之下, percentiles
度量聚合使用的内存较少,但会近似百分比。
指定的指标必须是数值类型,并且同级聚合必须是多桶聚合。
参数
avg_bucket
聚合接受以下参数。
参数 | 必需/可选 | 数据类型 | 描述 |
---|---|---|---|
buckets_path | 必需 | 字符串 | 要聚合的聚合桶的路径。请参阅桶路径。 |
gap_policy | 可选 | 字符串 | 应用于缺失数据的策略。有效值为 skip 和 insert_zeros 。默认为 skip 。请参阅数据间隙。 |
format | 可选 | 字符串 | 一个 DecimalFormat 格式化字符串。将格式化输出返回到聚合的 value_as_string 属性中。 |
percents | 可选 | 列表 | 一个包含任意数量的要包含在输出中的数值百分比值的列表。有效值介于 0.0 和 100.0 之间(含)。默认为 [1.0, 5.0, 25.0, 50.0, 75.0, 95.0, 99.0] 。 |
keyed | 可选 | 布尔型 | 是否将输出格式化为字典而不是键值对对象数组。默认为 true (将输出格式化为键值对)。 |
示例
以下示例使用 OpenSearch Dashboards 电子商务示例数据创建一个以一周为间隔的日期直方图。sum
子聚合计算每周的 taxful_total_price
总和。最后,percentiles_bucket
聚合根据这些总和计算每周的百分位值
POST /opensearch_dashboards_sample_data_ecommerce/_search
{
"size": 0,
"aggs": {
"weekly_sales": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "week"
},
"aggs": {
"total_price": {
"sum": {
"field": "taxful_total_price"
}
}
}
},
"percentiles_monthly_sales": {
"percentiles_bucket": {
"buckets_path": "weekly_sales>total_price"
}
}
}
}
示例响应
聚合返回每周价格总和的默认百分位值
响应
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4675,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"weekly_sales": {
"buckets": [
{
"key_as_string": "2025-03-24T00:00:00.000Z",
"key": 1742774400000,
"doc_count": 582,
"total_price": {
"value": 41455.5390625
}
},
{
"key_as_string": "2025-03-31T00:00:00.000Z",
"key": 1743379200000,
"doc_count": 1048,
"total_price": {
"value": 79448.60546875
}
},
{
"key_as_string": "2025-04-07T00:00:00.000Z",
"key": 1743984000000,
"doc_count": 1048,
"total_price": {
"value": 78208.4296875
}
},
{
"key_as_string": "2025-04-14T00:00:00.000Z",
"key": 1744588800000,
"doc_count": 1073,
"total_price": {
"value": 81277.296875
}
},
{
"key_as_string": "2025-04-21T00:00:00.000Z",
"key": 1745193600000,
"doc_count": 924,
"total_price": {
"value": 70494.2578125
}
}
]
},
"percentiles_monthly_sales": {
"values": {
"1.0": 41455.5390625,
"5.0": 41455.5390625,
"25.0": 70494.2578125,
"50.0": 78208.4296875,
"75.0": 79448.60546875,
"95.0": 81277.296875,
"99.0": 81277.296875
}
}
}
}
示例:选项
下一个示例使用与前一个示例相同的数据计算百分位,但存在以下差异
percents
参数指定只计算第 25、50 和 75 百分位。- 使用
format
参数追加字符串格式的输出。 - 通过将
keyed
参数设置为false
,结果将显示为键值对对象(并附带字符串值)。
示例如下
POST /opensearch_dashboards_sample_data_ecommerce/_search
{
"size": 0,
"aggs": {
"weekly_sales": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "week"
},
"aggs": {
"total_price": {
"sum": {
"field": "taxful_total_price"
}
}
}
},
"percentiles_monthly_sales": {
"percentiles_bucket": {
"buckets_path": "weekly_sales>total_price",
"percents": [25.0, 50.0, 75.0],
"format": "$#,###.00",
"keyed": false
}
}
}
}
示例响应:选项
这些选项修改了聚合的输出
响应
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4675,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"weekly_sales": {
"buckets": [
{
"key_as_string": "2025-03-24T00:00:00.000Z",
"key": 1742774400000,
"doc_count": 582,
"total_price": {
"value": 41455.5390625
}
},
{
"key_as_string": "2025-03-31T00:00:00.000Z",
"key": 1743379200000,
"doc_count": 1048,
"total_price": {
"value": 79448.60546875
}
},
{
"key_as_string": "2025-04-07T00:00:00.000Z",
"key": 1743984000000,
"doc_count": 1048,
"total_price": {
"value": 78208.4296875
}
},
{
"key_as_string": "2025-04-14T00:00:00.000Z",
"key": 1744588800000,
"doc_count": 1073,
"total_price": {
"value": 81277.296875
}
},
{
"key_as_string": "2025-04-21T00:00:00.000Z",
"key": 1745193600000,
"doc_count": 924,
"total_price": {
"value": 70494.2578125
}
}
]
},
"percentiles_monthly_sales": {
"values": [
{
"key": 25,
"value": 70494.2578125,
"25.0_as_string": "$70,494.26"
},
{
"key": 50,
"value": 78208.4296875,
"50.0_as_string": "$78,208.43"
},
{
"key": 75,
"value": 79448.60546875,
"75.0_as_string": "$79,448.61"
}
]
}
}
}