字符串统计(string_stats)聚合

一种multi-value(多值) 度量聚合,计算从聚合文档中提取的字符串值的统计数据。 这些值可以从文档中指定的 keyword 字段中检索,也可以由提供的脚本生成。

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

  • count - 计算的非空字段的数量。
  • min_length - 最短的词项的长度。
  • max_length - 最长的词项的长度。
  • avg_length - 所有词项的平均长度。
  • entropy - 对聚合收集的所有术语计算的香农熵(Shannon Entropy)。 香农熵量化了字段中包含的信息量。 这是一个非常有用的度量,用于测量数据集的各种属性,如多样性、相似性、随机性等。

假设数据由 twitter 消息组成:

POST /twitter/_search?size=0
{
    "aggs" : {
        "message_stats" : { "string_stats" : { "field" : "message.keyword" } }
    }
}

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

{
    ...

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

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

字符分布

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

POST /twitter/_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 对象显示每个字符在所有词项中出现的概率。字符按概率降序排列。

脚本

基于脚本计算消息(message)的字符串统计信息:

POST /twitter/_search?size=0
{
    "aggs" : {
        "message_stats" : {
             "string_stats" : {
                 "script" : {
                     "lang": "painless",
                     "source": "doc['message.keyword'].value"
                 }
             }
         }
    }
}

这将把 script 参数解释为一个inline(内联) 脚本,使用 painless(无痛) 脚本语言,没有脚本参数。 要使用存储的脚本,请使用以下语法:

POST /twitter/_search?size=0
{
    "aggs" : {
        "message_stats" : {
            "string_stats" : {
                "script" : {
                    "id": "my_script",
                    "params" : {
                        "field" : "message.keyword"
                    }
                }
            }
        }
    }
}

值脚本(value script)

可以使用值脚本来修改消息(例如,我们可以添加前缀)并计算新的统计数据:

POST /twitter/_search?size=0
{
    "aggs" : {
        "message_stats" : {
            "string_stats" : {
                "field" : "message.keyword",
                "script" : {
                    "lang": "painless",
                    "source": "params.prefix + _value",
                    "params" : {
                        "prefix" : "Message: "
                    }
                }
            }
        }
    }
}

缺失的值

参数 missing 定义应该如何处理有缺失值的文档。 默认情况下,它们会被忽略,但也可以将它们视为有一个(默认)值。

POST /twitter/_search?size=0
{
    "aggs" : {
        "message_stats" : {
            "string_stats" : {
                "field" : "message.keyword",
                "missing": "[empty message]" 
            }
        }
    }
}

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