【发布时间】:2018-09-14 05:00:00
【问题描述】:
使用 ElasticSearch 5.2
作为示例,我将使用代表世界上所有人的数据库。
示例请求:获取按国家/地区分组的 30 岁以上所有人的平均工资。 (响应应包含平均工资排名前 10 的国家/地区)
我构建聚合查询的步骤:
- 过滤原始数据集 (
filter: age > 30) - 在“
country”上聚合 - 在字段“
salary”上使用度量平均值
我面临的问题是我可以在聚合之前应用过滤器,或者对存储桶进行排序,但似乎 ES 不允许我同时执行这两种操作?
换句话说:我不能在“myInnerAggregation”上应用我的“order”查询,因为它前面是“myFilterAggregation”
GET myIndex/_search
{
"size":0,
"aggs": {
"myAggregation": {
"terms": {
"size":10,
"field": "country",
"order": [
{
"myInnerAggregation": "desc"
// I cannot specify "myInnerAggregation" here, only
// "myFilterAggregation" (because it's out of scope I guess)
}
]
},
"aggs": {
"myFilterAggregation": {
"filter": { /* age > 30 (filter syntax is not the problem)*/},
"aggs": {
"myInnerAggergation": {
"avg": {
"field": "salary"
}
}
}
}
}
}
} }
我已经看到 ES 6.1+ 支持“bucket_sort”,这可能会解决这个问题,但我不敢相信像这样的简单聚合不能被 ES 5.2 处理?
【问题讨论】:
标签: json elasticsearch