MST
星途 面试题库

面试题:ElasticSearch过滤器聚合:多层嵌套聚合及数据筛选优化

在ElasticSearch索引中,文档结构类似博客文章,包含作者、分类、发布时间等信息。现在需求是先按作者进行聚合,在每个作者下按分类聚合,且每个分类只统计最近一个月发布的文章数量。请阐述实现思路并给出优化查询性能的方法及对应的DSL语句。
19.2万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 按作者聚合:使用 terms 聚合,以作者字段作为聚合依据,将所有文档按作者分组。
  2. 在作者聚合内按分类聚合:在作者聚合的子聚合中,再使用 terms 聚合,以分类字段作为聚合依据,将每个作者下的文档按分类分组。
  3. 统计最近一个月发布文章数量:对于每个分类聚合,使用 filter 子聚合来过滤出最近一个月发布的文章,再在 filter 子聚合内使用 value_count 来统计符合条件的文章数量。

优化查询性能的方法

  1. 使用日期范围缓存:如果数据量较大且查询频繁,可以对日期范围过滤进行缓存,减少重复计算。
  2. 索引优化:确保作者、分类、发布时间字段都有适当的索引,尤其是发布时间字段,便于快速过滤。
  3. 合理设置聚合大小:避免聚合返回过多不必要的数据,设置合理的 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" 表示从当前时间往前推一个月并取到该月的第一天。