字符串统计聚合

编辑

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

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

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

例如

resp = client.search(
    index="my-index-000001",
    size="0",
    aggs={
        "message_stats": {
            "string_stats": {
                "field": "message.keyword"
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  size: 0,
  body: {
    aggregations: {
      message_stats: {
        string_stats: {
          field: 'message.keyword'
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  size: 0,
  aggs: {
    message_stats: {
      string_stats: {
        field: "message.keyword",
      },
    },
  },
});
console.log(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) 参数。

resp = client.search(
    index="my-index-000001",
    size="0",
    aggs={
        "message_stats": {
            "string_stats": {
                "field": "message.keyword",
                "show_distribution": True
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  size: 0,
  body: {
    aggregations: {
      message_stats: {
        string_stats: {
          field: 'message.keyword',
          show_distribution: true
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  size: 0,
  aggs: {
    message_stats: {
      string_stats: {
        field: "message.keyword",
        show_distribution: true,
      },
    },
  },
});
console.log(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,请在运行时字段上运行聚合。

resp = client.search(
    index="my-index-000001",
    size=0,
    runtime_mappings={
        "message_and_context": {
            "type": "keyword",
            "script": "\n        emit(doc['message.keyword'].value + ' ' + doc['context.keyword'].value)\n      "
        }
    },
    aggs={
        "message_stats": {
            "string_stats": {
                "field": "message_and_context"
            }
        }
    },
)
print(resp)
const response = await client.search({
  index: "my-index-000001",
  size: 0,
  runtime_mappings: {
    message_and_context: {
      type: "keyword",
      script:
        "\n        emit(doc['message.keyword'].value + ' ' + doc['context.keyword'].value)\n      ",
    },
  },
  aggs: {
    message_stats: {
      string_stats: {
        field: "message_and_context",
      },
    },
  },
});
console.log(response);
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 参数定义了应如何处理缺少值的文档。默认情况下,它们将被忽略,但也可以将它们视为具有值。

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

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