MST
星途 面试题库

面试题:ElasticSearch聚合功能之高级难度

有一个ElasticSearch索引记录了网站用户的访问日志,每个文档包含用户ID(user_id)、访问时间(timestamp)、访问页面(page)等字段。现在要求查询出每个用户最近一次访问的页面信息,并且按用户ID排序。请详细说明实现思路并写出对应的聚合DSL语句。
49.8万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 首先,使用terms聚合按照user_id进行分组。
  2. 然后,在每个分组内,使用top_hits子聚合来获取每个用户最近一次访问的记录。top_hits聚合可以按照timestamp字段降序排序,然后只取第一条记录,这样就能得到每个用户最近一次访问的信息。
  3. 最后,对结果按照user_id进行排序。

聚合DSL语句

{
    "size": 0,
    "aggs": {
        "by_user": {
            "terms": {
                "field": "user_id",
                "order": {
                    "_key": "asc"
                }
            },
            "aggs": {
                "latest_visit": {
                    "top_hits": {
                        "sort": [
                            {
                                "timestamp": {
                                    "order": "desc"
                                }
                            }
                        ],
                        "_source": {
                            "includes": ["user_id", "timestamp", "page"]
                        },
                        "size": 1
                    }
                }
            }
        }
    }
}