我在弹性搜索索引中有一个字符串字段,并尝试在该字段上进行百分位数或分位数聚合(这对数字字段很有效)。
假设字符串字段中有 10,000 个名称或城市,预期结果应该是这样的:
当要求四个桶时:
A-E (2500), F-K (2500), L-M (2500), N-Z (2500)
这些术语不是按字母顺序均匀分布的,但桶的大小应该大致相同。2600,2400,2800,2200 的术语计数是可以接受的。
我在弹性搜索索引中有一个字符串字段,并尝试在该字段上进行百分位数或分位数聚合(这对数字字段很有效)。
假设字符串字段中有 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",
...
}
现在您可以对字段进行术语聚合,这与aggscity_first_char
相比将非常快。script
希望这可以帮助。