面试题答案
一键面试关键步骤
- 定义金额区间配置:可以将金额区间配置存储在配置文件或数据库中,在代码中读取。
- 构建日期范围:利用Elasticsearch的日期数学格式API来指定过去三年的时间范围。
- 聚合操作:使用Elasticsearch的聚合功能,先按季度进行日期范围聚合,再在每个季度内按金额区间进行聚合统计订单数量。
代码示例(以Python和Elasticsearch-py为例)
from elasticsearch import Elasticsearch
# 连接Elasticsearch
es = Elasticsearch(['http://localhost:9200'])
# 定义金额区间配置
amount_ranges = [
{'from': 0, 'to': 100},
{'from': 100, 'to': 200},
{'from': 200, 'to': None}
]
# 构建日期范围
date_range = 'now-3y/y' # 过去三年
# 构建聚合查询
body = {
"aggs": {
"quarterly_orders": {
"date_histogram": {
"field": "order_time",
"calendar_interval": "quarter",
"format": "yyyy-MM-dd",
"extended_bounds": {
"min": date_range,
"max": "now"
}
},
"aggs": {
"amount_ranges": {
"range": {
"field": "order_amount",
"ranges": amount_ranges
}
}
}
}
},
"size": 0
}
# 执行查询
response = es.search(index='order_index', body=body)
# 处理结果
for bucket in response['aggregations']['quarterly_orders']['buckets']:
quarter = bucket['key_as_string']
print(f"季度: {quarter}")
for amount_bucket in bucket['amount_ranges']['buckets']:
amount_range = f"{amount_bucket['from'] or 0}-{amount_bucket['to'] or 'inf'}"
count = amount_bucket['doc_count']
print(f"金额区间: {amount_range}, 订单数量: {count}")
上述代码中,order_time
是订单的下单时间字段,order_amount
是订单金额字段,order_index
是存储订单数据的Elasticsearch索引。通过 date_histogram
按季度聚合订单时间,通过 range
按金额区间聚合订单金额,并统计每个区间的订单数量。