用于存储表示直方图的pre-aggregated数字数据的字段。此数据使用两个成对数组定义:
- 由两个double组成的value数组,表示histogram的存储桶(buckets)。必须按升序提供这些值。
- 对应的integer numbers的counts数组,表示每个存储桶中有多少个值。这些数字必须为正或零。
因为values数组中的元素对应于count数组中相同位置的元素,所以这两个数组必须具有相同的长度。
注意:
histogram 字段只能存储每个文档的一对值和计数数组。不支持嵌套(nested)数组。
histogram字段不支持排序。
histogram字段主要用于聚合。为了使聚合更容易访问,histogram字段数据存储为二进制文档值,而不是索引。它的字节大小最多为13*numValues,其中numValues是所提供数组的长度。
由于数据未indexed,因此只能对以下聚合和查询使用histogram字段:
- min?aggregation
- max?aggregation
- sum?aggregation
- value_count?aggregation
- avg?aggregation
- percentiles?aggregation
- percentile ranks?aggregation
- boxplot?aggregation
- histogram?aggregation
- range?aggregation
- exists?aggregation
Building a histogram
当使用histogram作为聚合的一部分时,结果的准确性将取决于histogram的构造方式。重要的是要考虑百分位数聚集模式,将被用来建立它。一些可能性包括:
- 对于T-Digest模式,values数组表示平均质心位置,counts数组表示归属于每个质心的值的number。如果算法已经开始近似百分位数,则histogram中会出现这种不准确的情况。
- 对于High Dynamic Range(HDR)直方图模式,value数组表示每个桶间隔的固定上限,count数组表示归属于每个间隔的值的数量。此实现维护一个固定的最坏情况百分比错误(指定为有效数字的数量),因此生成histogram时使用的值将是聚合时可以达到的最大精度。
histogram字段是“算法无关”字段,不存储特定于T-Digest要或HDRHistogram的数据。虽然这意味着该字段在技术上可以通过任何一种算法聚合,但在实践中,用户应选择一种算法,并以这种方式索引数据(例如,T-Digest的质心或HDRHistogram的间隔),以确保最佳精度。
例子:
以下创建索引API请求使用两个字段映射创建新索引:
PUT my-index-000001
{
"mappings" : {
"properties" : {
"my_histogram" : {
"type" : "histogram"
},
"my_text" : {
"type" : "keyword"
}
}
}
}
以下索引API请求存储两个histograms的pre-aggregated:histogram_1和histogram_2。
PUT my-index-000001/_doc/1
{
"my_text" : "histogram_1",
"my_histogram" : {
"values" : [0.1, 0.2, 0.3, 0.4, 0.5], (1)
"counts" : [3, 7, 23, 12, 6] (2)
}
}
PUT my-index-000001/_doc/2
{
"my_text" : "histogram_2",
"my_histogram" : {
"values" : [0.1, 0.25, 0.35, 0.4, 0.45, 0.5], (1)
"counts" : [8, 17, 8, 7, 6, 2] (2)
}
}
(1)每个bucket的值。数组中的值被视为双精度值,必须按递增顺序给出。对于T-Digest直方图,该值表示平均值。对于HDR直方图,这表示迭代到的值。
(2)每桶的count。数组中的值被视为整数,必须为正或零。负值将被拒绝。桶和计数之间的关系由数组中的位置给出。
|