本地英文版地址: ../en/histogram.html
一种存储表示直方图的预聚合数值数据的字段。 该数据使用两个成对的数组来定义:
因为values
数组中的元素对应于counts
数组中相同位置的元素,所以这两个数组的长度必须相同。
-
histogram
字段只能为每个文档存储一对values
和counts
数组。 不支持嵌套数组。 -
histogram
字段不支持排序。
histogram
字段主要用于聚合。
为了使聚合更容易访问histogram
类型字段的数据,histogram
字段数据存储为二进制文档值(doc_values),且不会进行索引。
它的字节大小最多为13 * numValues
,其中numValues
是所给定数组的长度。
因为数据没有进行索引,所以只能对以下聚合和查询使用histogram
字段:
- percentiles(百分位数)聚合
- percentile ranks(百分位数等级)聚合
- boxplot(箱线图聚集)聚合
- exists(存在)查询
当使用直方图作为聚合的一部分时,结果的准确性将取决于直方图的构造方式。 重要的是要考虑将用于构建它的百分位数聚合模式。 一些可能性包括:
-
对于T-Digest模式,
values
数组表示平均质心位置,counts
数组表示归属于每个质心的值的数量。 如果算法已经开始逼近百分位数,这种不准确性会在直方图中延续。 -
对于高动态范围(HDR)直方图模式,
values
数组表示每个时段间隔的固定上限,counts
数组表示归属于每个间隔的值的数量。 该实现保持固定的最坏情况百分比误差(指定为有效数字的数量),因此生成直方图时使用的值将是你在聚合时可以达到的最大精度。
直方图字段是“算法不可知的”,不存储特定于 T-Digest 或 HDRHistogram 的数据。 虽然这意味着该字段在技术上可以使用任何一种算法进行聚合,但在实践中,用户应该选择一种算法并以这种方式索引数据(例如 T-Digest 的质心或 HDRHistogram 的区间)以确保最佳准确性。
下面的创建索引(create index)API 请求创建了一个具有两个字段映射的新索引:
-
my_histogram
,一个histogram
类型的字段,用于存储百分位数数据 -
my_text
,一个keyword
类型的字段,用于存储直方图的标题
PUT my_index { "mappings": { "properties": { "my_histogram": { "type" : "histogram" }, "my_text" : { "type" : "keyword" } } } }
下面的 编制索引(index) API 请求存储两个直方图的预聚合:histogram_1
和histogram_2
。
PUT my_index/_doc/1 { "my_text" : "histogram_1", "my_histogram" : { "values" : [0.1, 0.2, 0.3, 0.4, 0.5], "counts" : [3, 7, 23, 12, 6] } } PUT my_index/_doc/2 { "my_text" : "histogram_2", "my_histogram" : { "values" : [0.1, 0.25, 0.35, 0.4, 0.45, 0.5], "counts" : [8, 17, 8, 7, 6, 2] } }
每个桶的值。 数组中的值被视为双精度值,必须按升序排列。 对于T-Digest直方图,该值代表平均值。 在 HDR 直方图的情况下,这表示迭代的值。 |
|
每个桶中的计数。 数组中的值被视为整数,并且必须是正数或零。 负值将被拒绝。 桶和计数之间的关系由数组中的位置给出。 |