我发现的唯一接近的事情是:Multiple group-by in Elasticsearch
基本上,我尝试获得以下MySql
查询的ES等价物:
select gender, age_range, count(distinct profile_id) as count
FROM TABLE group by age_range, gender
年龄和性别本身很容易得到:
{
"query": {
"match_all": {}
},
"facets": {
"ages": {
"terms": {
"field": "age_range",
"size": 20
}
},
"gender_by_age": {
"terms": {
"fields": [
"age_range",
"gender"
]
}
}
},
"size": 0
}
其给出:
{
"ages": {
"_type": "terms",
"missing": 0,
"total": 193961,
"other": 0,
"terms": [
{
"term": 0,
"count": 162643
},
{
"term": 3,
"count": 10683
},
{
"term": 4,
"count": 8931
},
{
"term": 5,
"count": 4690
},
{
"term": 6,
"count": 3647
},
{
"term": 2,
"count": 3247
},
{
"term": 1,
"count": 120
}
]
},
"total_gender": {
"_type": "terms",
"missing": 0,
"total": 193961,
"other": 0,
"terms": [
{
"term": 1,
"count": 94799
},
{
"term": 2,
"count": 62645
},
{
"term": 0,
"count": 36517
}
]
}
}
但现在我需要这样的东西:
[breakdown_gender] => Array
(
[1] => Array
(
[0] => 264
[1] => 1
[2] => 6
[3] => 67
[4] => 72
[5] => 40
[6] => 23
)
[2] => Array
(
[0] => 153
[2] => 2
[3] => 21
[4] => 35
[5] => 22
[6] => 11
)
)
请注意,0,1,2,3,4,5,6
是年龄范围的“Map”,因此它们实际上意味着一些东西:)而不仅仅是数字。例如,性别[1](“男性”)分解为年龄范围[0](“18岁以下”),计数为246。
4条答案
按热度按时间hyrbngr71#
从
ElasticSearch
的1.0版开始,新的aggregations API允许使用 * 子聚合 * 按多个字段进行分组。假设您要按字段field1
、field2
和field3
进行分组:当然,您可以根据需要对任意多个字段执行此操作。
更新日期:
为了完整起见,下面是上述查询的输出,下面是python代码,用于生成聚合查询并将结果扁平化为字典列表。
下面的python代码执行给定字段列表的group-by。如果你指定
include_missing=True
,它还包括一些字段丢失的值的组合(如果你有2.0版本的Elasticsearch,由于this,你就不需要它)mrphzbgm2#
由于您只有2个字段,一个简单的方法是使用单个方面进行两次查询。
而对于女性:
或者,您可以使用facet筛选器在单个查询中执行此操作(有关详细信息,请参阅this link)
更新:
因为即将移除Facet。这是使用汇总的解决方案:
798qvoo83#
我知道,它没有回答这个问题,但我发现这个页面,而寻找一种方法来做多个术语聚合。最后,找到了关于这个功能的信息在文档中。也许它会帮助别人...
multi_terms
aggregation:其结果将接近于
piv4azn74#
我已经尝试对组织年收入的配置文件进行分组,然后使用以下查询在行业之间进一步分配计数
示例:
}
输出量: