MST

星途 面试题库

面试题:ElasticSearch存储桶聚合中嵌套聚合的使用场景及实现方式

在ElasticSearch索引中,文档结构是多层嵌套的,例如一篇博客文章包含多个评论,评论又包含点赞数等信息。请阐述在这种场景下,如何使用存储桶聚合进行嵌套聚合,比如先按文章分组,再在每个文章分组内按评论的点赞数区间进行分组统计评论数量,给出详细的DSL示例及解释。
31.3万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

以下是实现该需求的DSL示例及解释:

{
    "aggs": {
        "by_article": {
            "terms": {
                "field": "article_id" // 按文章ID进行分组,假设存在article_id字段标识文章
            },
            "aggs": {
                "by_comment_likes": {
                    "range": {
                        "field": "comment.likes", // 评论的点赞数字段,假设评论结构中点赞数字段为comment.likes
                        "ranges": [
                            { "from": 0, "to": 10 },
                            { "from": 10, "to": 20 },
                            { "from": 20, "to": null }
                        ]
                    }
                }
            }
        }
    }
}

解释:

  1. 外层聚合
    • by_article是一个terms聚合,通过article_id字段对文章进行分组。这会将所有文档按文章ID进行归类。
  2. 内层聚合
    • by_comment_likes是在by_article聚合内的range聚合。
    • 它基于comment.likes字段(假设文档结构中评论的点赞数字段为comment.likes)进行点赞数区间的划分。
    • ranges数组定义了不同的点赞数区间,分别是0到10(不包含10),10到20(不包含20)以及20及以上。

通过这种嵌套聚合方式,首先按文章进行分组,然后在每个文章分组内按评论的点赞数区间统计评论数量。