面试题答案
一键面试实现思路
- 按作者聚合:使用
terms
聚合,以作者字段作为聚合依据,将所有文档按作者分组。 - 在作者聚合内按分类聚合:在作者聚合的子聚合中,再使用
terms
聚合,以分类字段作为聚合依据,将每个作者下的文档按分类分组。 - 统计最近一个月发布文章数量:对于每个分类聚合,使用
filter
子聚合来过滤出最近一个月发布的文章,再在filter
子聚合内使用value_count
来统计符合条件的文章数量。
优化查询性能的方法
- 使用日期范围缓存:如果数据量较大且查询频繁,可以对日期范围过滤进行缓存,减少重复计算。
- 索引优化:确保作者、分类、发布时间字段都有适当的索引,尤其是发布时间字段,便于快速过滤。
- 合理设置聚合大小:避免聚合返回过多不必要的数据,设置合理的
size
参数,例如size=0
只返回聚合结果而不返回文档。
DSL 语句
{
"size": 0,
"aggs": {
"authors": {
"terms": {
"field": "author",
"size": 100
},
"aggs": {
"categories": {
"terms": {
"field": "category",
"size": 100
},
"aggs": {
"last_month_posts": {
"filter": {
"range": {
"publish_date": {
"gte": "now-1M/M"
}
}
},
"aggs": {
"count": {
"value_count": {
"field": "_id"
}
}
}
}
}
}
}
}
}
}
其中:
"size": 0
表示不返回文档,只返回聚合结果。"authors"
是按作者聚合。"categories"
是在作者聚合内按分类聚合。"last_month_posts"
是过滤最近一个月发布的文章并统计数量。"now-1M/M"
表示从当前时间往前推一个月并取到该月的第一天。