MST
星途 面试题库

面试题:ElasticSearch日期数学格式在聚合分析中的复杂应用

给定一个电商订单索引,其中包含订单创建时间字段。现在要对过去30天内按每周进行订单金额的求和聚合分析,同时要考虑到跨年等特殊情况。请阐述实现思路并给出相应的ElasticSearch DSL代码,说明日期数学格式在此处如何确保时间范围的准确划分。
34.9万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 确定时间范围:获取当前时间,并计算30天前的时间,以此确定要查询的订单时间范围。
  2. 聚合分析:使用Elasticsearch的日期直方图(date histogram)进行按周聚合,在聚合内对订单金额进行求和。
  3. 处理跨年:日期直方图会自动处理跨年等情况,按周划分时会根据实际的日期进行准确切割。

ElasticSearch DSL代码

{
    "query": {
        "range": {
            "order_create_time": {
                "gte": "now-30d/d",
                "lt": "now/d"
            }
        }
    },
    "aggs": {
        "weekly_order_amount": {
            "date_histogram": {
                "field": "order_create_time",
                "calendar_interval": "week",
                "format": "yyyy - w"
            },
            "aggs": {
                "total_amount": {
                    "sum": {
                        "field": "order_amount"
                    }
                }
            }
        }
    }
}

日期数学格式说明

  1. now-30d/dnow 代表当前时间,now-30d 表示30天前的时间,/d 是日期舍入操作,将时间舍入到当天的开始(即凌晨0点),确保准确获取过去30天内的订单数据。
  2. now/d:将当前时间舍入到当天的开始,用于确定查询范围的上限。
  3. "format": "yyyy - w":设置日期直方图返回结果的格式,yyyy 表示4位年份,w 表示一年中的第几周,这样可以清晰标识每周的聚合结果,即使跨年也能准确区分不同周的数据。