面试题答案
一键面试1. 设计完整的解决方案
- 嵌套聚合设计:利用Elasticsearch的聚合功能,按照题目要求进行多层嵌套聚合。先按
region
聚合,然后在每个region
聚合结果内按age_group
聚合,最后在每个age_group
聚合内按gender
聚合并计算value
字段的加权平均值。 - 筛选条件:在
age_group
聚合结果中,使用bucket_selector
来筛选出加权平均值大于阈值(如100)的聚合。 - 性能优化措施:
- 数据建模优化:确保索引字段有合适的映射,特别是数值型字段和参与聚合的字段,合理设置
doc_values
等参数以提升聚合性能。 - 缓存:利用Elasticsearch的缓存机制,例如
filter
缓存,如果查询条件中有固定的过滤条件,可以利用缓存来减少重复计算。 - 分片优化:合理设置索引的分片数量,确保数据均匀分布在各个分片上,避免数据倾斜,提高聚合计算的并行度。
- 数据建模优化:确保索引字段有合适的映射,特别是数值型字段和参与聚合的字段,合理设置
2. DSL语句
{
"size": 0,
"aggs": {
"by_region": {
"terms": {
"field": "region.keyword",
"size": 100
},
"aggs": {
"by_age_group": {
"terms": {
"field": "age_group.keyword",
"size": 100
},
"aggs": {
"weighted_avg_by_gender": {
"weighted_avg": {
"value": {
"field": "value"
},
"weight": {
"field": "weight"
}
}
},
"filter_weighted_avg": {
"bucket_selector": {
"buckets_path": {
"avg_value": "weighted_avg_by_gender"
},
"script": "params.avg_value > 100"
}
}
}
}
}
}
}
}
解释:
size: 0
表示不返回文档,只返回聚合结果。by_region
是按region
进行terms
聚合。by_age_group
是在每个region
聚合结果内按age_group
进行terms
聚合。weighted_avg_by_gender
是在每个age_group
聚合内按gender
计算value
字段的加权平均值。filter_weighted_avg
使用bucket_selector
筛选出加权平均值大于100的age_group
聚合。