MST

星途 面试题库

面试题:ElasticSearch高级聚合查询与嵌套文档处理

有一个ElasticSearch索引,其中文档结构为包含嵌套对象数组的形式,例如一篇文章文档中有多个评论的嵌套数组。现在需要对这些评论按不同维度进行高级聚合,如按评论者分组统计评论数量,并且在每个评论者分组内再按评论的点赞数进行排序。请详细阐述如何使用ElasticSearch的查询语言实现这样的高级聚合功能,包括映射设置、查询语句以及结果解读。
11.9万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

映射设置

  1. 嵌套对象映射:因为评论是嵌套在文章文档中的数组,需要在映射中指定评论字段为 nested 类型。例如:
{
  "mappings": {
    "properties": {
      "article_title": { "type": "text" },
      "comments": {
        "type": "nested",
        "properties": {
          "commenter": { "type": "keyword" },
          "like_count": { "type": "integer" }
        }
      }
    }
  }
}

这里将 comments 字段定义为 nested 类型,确保对其内部对象的操作能正确处理数组中的每个元素。commenter 使用 keyword 类型以便进行分组聚合,like_count 使用 integer 类型存储点赞数。

查询语句

使用 aggs 关键字来定义聚合。

{
  "size": 0,
  "aggs": {
    "commenters": {
      "nested": {
        "path": "comments"
      },
      "aggs": {
        "by_commenter": {
          "terms": {
            "field": "comments.commenter",
            "size": 100
          },
          "aggs": {
            "sort_by_likes": {
              "top_hits": {
                "sort": [
                  {
                    "comments.like_count": {
                      "order": "desc"
                    }
                  }
                ],
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}
  1. 外层聚合
    • nested 聚合指定 pathcomments,这表示我们要对 comments 这个嵌套数组进行操作。
  2. 按评论者分组
    • nested 聚合内部,terms 聚合按 comments.commenter 字段进行分组,size 设置为100,表示最多返回100个评论者分组。
  3. 按点赞数排序
    • 在每个评论者分组内,使用 top_hits 聚合按 comments.like_count 字段进行降序排序,size 设置为10,表示每个评论者分组内只返回点赞数最多的前10条评论。

结果解读

  1. 整体结构:结果会以嵌套的JSON结构呈现。最外层是与查询对应的响应,其中 aggregations 字段包含我们定义的聚合结果。
  2. 评论者分组
    • commenters.by_commenter 中,每个 bucket 代表一个评论者分组,key 是评论者的名称,doc_count 是该评论者的评论数量。
  3. 按点赞数排序结果
    • 在每个评论者分组的 sort_by_likes.hits.hits 数组中,是按点赞数降序排列的评论。每个元素包含了对应评论的详细信息,如 _source 中包含原始的评论数据,sort 数组中显示按点赞数排序的依据。例如:
{
  "aggregations": {
    "commenters": {
      "doc_count": 100,
      "by_commenter": {
        "buckets": [
          {
            "key": "commenter1",
            "doc_count": 5,
            "sort_by_likes": {
              "hits": {
                "total": {
                  "value": 5,
                  "relation": "eq"
                },
                "hits": [
                  {
                    "_source": {
                      "comments": [
                        {
                          "commenter": "commenter1",
                          "like_count": 100
                        }
                      ]
                    },
                    "sort": [
                      100
                    ]
                  },
                  // 其他按点赞数降序排列的评论
                ]
              }
            }
          },
          // 其他评论者分组
        ]
      }
    }
  }
}

通过上述映射设置、查询语句和结果解读,可以实现对嵌套在文章文档中的评论按评论者分组统计评论数量,并在每个评论者分组内按评论的点赞数进行排序的高级聚合功能。