elasticsearch - Elasticsearch中字符串字段的分位数聚合

标签 elasticsearch aggregation percentile quantile

我在elasticsearch索引中有一个字符串字段,并尝试在该字段上执行百分位数或分位数聚合(在数字字段上效果很好)。

假设字符串字段中有10,000个名称或城市,则预期结果应该是这样的:

索要四个水桶时:

A-E (2500), F-K (2500), L-M (2500), N-Z (2500)

这些术语不是按字母顺序均匀分布,但存储桶的大小应大致相同。 2600,2400,2800,2200的期限计数是可以接受的。

最佳答案

我不太明白你的问题。但是,如果您有很多城市,似乎可以做任何事情。这就是您可以做的。考虑您的文档是这样的:

{
    "city": "New York",
    ...
}

您可以运行以下聚合查询:
curl -XGET http://localhost:9200/aggs/cities/_search
{
    "query": {
        "match_all": {}
    },
    "aggs": {
        "cities_by_first_char": {
            "terms": {
                "field": "city",
                "script": "_value[0]"
            }
        }
    }
}

使用此方法,您可以看到城市的第一个字符,然后可以根据需要创建任意数量的范围组,然后在此基础上执行计算。

如果您打算大量运行这种查询/汇总,那么我建议您不要使用script汇总。问题在于,由于没有使Elasticsearch执行脚本,因此使用大量文档会变得非常缓慢。如果您的用例仅限于以第一个字符开头的城市,那么我建议您像在文档中那样添加另一个字段,如下所示:
{
    "city": "New York",
    "city_first_char": "N",
    ...
}

现在,您可以在city_first_char字段上进行术语汇总,这与script aggs相比非常快。

希望这可以帮助。

关于elasticsearch - Elasticsearch中字符串字段的分位数聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24633302/

相关文章:

web-services - Apache Camel 聚合多个REST服务响应

python - 属性错误 : 'module' object has no attribute 'percentile'

mysql - 如何使用 MySQL 实现加权百分位数

laravel - 如何在MathML中将Elasticsearch用于索引公式?

node.js - 如何计算mongoDB中唯一数据的数量

templates - 如何在 Elasticsearch 中为所有 future 字段定义映射

PyMongo 聚合 "AttributeError: ' dict' 对象没有属性 '_txn_read_preference' "

matlab - 如何在 MATLAB 中计算 99% 的覆盖率?

elasticsearch - Logstash GROK 解析可变长度的键/值对集

c# - 如何使用 Elasticsearch Nest 在一次操作中按 ID 删除多个文档