字符串统计聚合编辑

一个 multi-value 指标聚合,它计算从聚合文档中提取的字符串值的统计信息。这些值可以从特定的 keyword 字段中检索。

字符串统计聚合返回以下结果

  • count - 统计的非空字段数。
  • min_length - 最短词的长度。
  • max_length - 最长词的长度。
  • avg_length - 所有词的平均长度。
  • entropy - 所有由聚合收集的词计算的 香农熵 值。香农熵量化了字段中包含的信息量。它是一个非常有用的指标,用于衡量数据集的各种属性,例如多样性、相似性、随机性等。

例如

response = client.search(
  index: 'my-index-000001',
  size: 0,
  body: {
    aggregations: {
      message_stats: {
        string_stats: {
          field: 'message.keyword'
        }
      }
    }
  }
)
puts response
POST /my-index-000001/_search?size=0
{
  "aggs": {
    "message_stats": { "string_stats": { "field": "message.keyword" } }
  }
}

上面的聚合计算了所有文档中 message 字段的字符串统计信息。聚合类型是 string_statsfield 参数定义了将计算统计信息的文档字段。上面将返回以下内容

{
  ...

  "aggregations": {
    "message_stats": {
      "count": 5,
      "min_length": 24,
      "max_length": 30,
      "avg_length": 28.8,
      "entropy": 3.94617750050791
    }
  }
}

聚合的名称(上面的 message_stats)也用作键,通过该键可以从返回的响应中检索聚合结果。

字符分布编辑

香农熵值的计算基于每个字符出现在聚合收集的所有词中的概率。要查看所有字符的概率分布,我们可以添加 show_distribution(默认值:false)参数。

response = client.search(
  index: 'my-index-000001',
  size: 0,
  body: {
    aggregations: {
      message_stats: {
        string_stats: {
          field: 'message.keyword',
          show_distribution: true
        }
      }
    }
  }
)
puts response
POST /my-index-000001/_search?size=0
{
  "aggs": {
    "message_stats": {
      "string_stats": {
        "field": "message.keyword",
        "show_distribution": true  
      }
    }
  }
}

show_distribution 参数设置为 true,以便在结果中返回所有字符的概率分布。

{
  ...

  "aggregations": {
    "message_stats": {
      "count": 5,
      "min_length": 24,
      "max_length": 30,
      "avg_length": 28.8,
      "entropy": 3.94617750050791,
      "distribution": {
        " ": 0.1527777777777778,
        "e": 0.14583333333333334,
        "s": 0.09722222222222222,
        "m": 0.08333333333333333,
        "t": 0.0763888888888889,
        "h": 0.0625,
        "a": 0.041666666666666664,
        "i": 0.041666666666666664,
        "r": 0.041666666666666664,
        "g": 0.034722222222222224,
        "n": 0.034722222222222224,
        "o": 0.034722222222222224,
        "u": 0.034722222222222224,
        "b": 0.027777777777777776,
        "w": 0.027777777777777776,
        "c": 0.013888888888888888,
        "E": 0.006944444444444444,
        "l": 0.006944444444444444,
        "1": 0.006944444444444444,
        "2": 0.006944444444444444,
        "3": 0.006944444444444444,
        "4": 0.006944444444444444,
        "y": 0.006944444444444444
      }
    }
  }
}

distribution 对象显示每个字符出现在所有词中的概率。字符按概率降序排序。

脚本编辑

如果您需要获取比单个字段更复杂的内容的 string_stats,请在 运行时字段 上运行聚合。

POST /my-index-000001/_search
{
  "size": 0,
  "runtime_mappings": {
    "message_and_context": {
      "type": "keyword",
      "script": """
        emit(doc['message.keyword'].value + ' ' + doc['context.keyword'].value)
      """
    }
  },
  "aggs": {
    "message_stats": {
      "string_stats": { "field": "message_and_context" }
    }
  }
}

缺失值编辑

missing 参数定义了如何处理缺少值的文档。默认情况下,它们将被忽略,但也可以将它们视为具有值。

response = client.search(
  index: 'my-index-000001',
  size: 0,
  body: {
    aggregations: {
      message_stats: {
        string_stats: {
          field: 'message.keyword',
          missing: '[empty message]'
        }
      }
    }
  }
)
puts response
POST /my-index-000001/_search?size=0
{
  "aggs": {
    "message_stats": {
      "string_stats": {
        "field": "message.keyword",
        "missing": "[empty message]" 
      }
    }
  }
}

message 字段中没有值的文档将被视为具有值 [empty message] 的文档。