【问题标题】:Quantile aggregation for string fields in elasticsearchelasticsearch中字符串字段的分位数聚合
【发布时间】:2014-08-29 06:37:28
【问题描述】:

我在弹性搜索索引中有一个 string 字段,并尝试在该字段上进行百分位数或分位数聚合(这对 numeric 字段非常有效)。

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

当要四个桶时:

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

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

【问题讨论】:

    标签: elasticsearch aggregation percentile quantile


    【解决方案1】:

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

    {
        "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 相比,这将非常快。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-07-21
      • 1970-01-01
      • 2021-04-25
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 2014-08-24
      • 1970-01-01
      相关资源
      最近更新 更多