原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/histogram.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/histogram.html

histogram(直方图)数据类型

一种存储表示直方图的预聚合数值数据的字段。 该数据使用两个成对的数组来定义:

  • 一个名为valuesdouble类型值的数组,表示直方图的桶。 这些值必须按升序提供。
  • 一个名为counts的与 values 中的值相对应的integer数组,表示每个桶中有多少个值。 这些数字必须是正数或零。

因为values数组中的元素对应于counts数组中相同位置的元素,所以这两个数组的长度必须相同。

  • histogram字段只能为每个文档存储一对valuescounts数组。 不支持嵌套数组。
  • histogram字段不支持排序。

使用

histogram字段主要用于聚合。 为了使聚合更容易访问histogram类型字段的数据,histogram字段数据存储为二进制文档值(doc_values),且不会进行索引。 它的字节大小最多为13 * numValues,其中numValues是所给定数组的长度。

因为数据没有进行索引,所以只能对以下聚合和查询使用histogram字段:

构建一个直方图

当使用直方图作为聚合的一部分时,结果的准确性将取决于直方图的构造方式。 重要的是要考虑将用于构建它的百分位数聚合模式。 一些可能性包括:

  • 对于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_1histogram_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 直方图的情况下,这表示迭代的值。

每个桶中的计数。 数组中的值被视为整数,并且必须是正数或零。 负值将被拒绝。 桶和计数之间的关系由数组中的位置给出。