弹性搜索中字符串字段的分位数聚合

时间:2014-07-08 13:37:07

标签: elasticsearch aggregation percentile quantile

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

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

当要求四个桶时:

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

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

1 个答案:

答案 0 :(得分:2)

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

{
    "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]"
            }
        }
    }
}

使用此功能,您将获得城市第一个字符的出现,然后您可以根据需要创建任意数量的范围组,然后在此基础上执行计算。

如果您计划经常运行此类查询/ aggs,那么我建议不要使用script aggs。问题是由于Elasticsearch没有执行脚本,因此大量文档变得非常慢。如果您的用例仅限于以第一个字符开头的城市,那么我建议您在文档中添加其他字段,如下所示:

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

现在你可以在city_first_char字段上进行术语聚合,与script aggs相比,它会非常快。

希望这有帮助。

相关问题