如何在ElasticSearch中按restaurant_id分组展示订单确认平均时长?
按restaurant_id分组计算订单确认平均时长的实现方案
Hey there! 作为ES新手,你提的这个需求完全可以通过Elasticsearch的**聚合(Aggregation)**功能实现,这正是聚合擅长的分组统计场景~
核心思路
我们需要两步聚合来达成目标:
- 用
terms聚合按restaurant_id对订单进行分组 - 在每个分组内,用
avg聚合计算该餐厅所有订单的confirm_duration平均值
具体DSL查询示例
GET /orders-development/_search { "size": 0, // 不返回原始订单文档,只聚焦聚合结果 "aggs": { "group_by_restaurant": { // 自定义分组聚合的名称,可按需修改 "terms": { "field": "restaurant_id", // 按restaurant_id字段分组 "size": 1000 // 显示前1000个餐厅的结果,可根据实际需求调整 }, "aggs": { "avg_confirm_duration": { // 自定义平均时长聚合的名称 "avg": { "field": "confirm_duration" // 计算confirm_duration的平均值 } } } } } }
结果解释
执行后你会得到类似这样的返回结果,清晰展示每个餐厅的订单量和平均确认时长:
{ "aggregations": { "group_by_restaurant": { "buckets": [ { "key": "4412917", // 餐厅ID "doc_count": 2, // 该餐厅的订单总数 "avg_confirm_duration": { "value": 4.5 // 该餐厅的订单确认平均时长 } }, { "key": "4322923", "doc_count": 1, "avg_confirm_duration": { "value": 3.2 // 示例值,实际为该餐厅的平均时长 } } ] } } }
新手必看注意事项
- 确保
restaurant_id是可聚合类型:如果你的restaurant_id是text类型,需要使用它的keyword子字段(比如restaurant_id.keyword)来分组,否则会因为text字段的分词导致分组混乱;如果是数字类型(integer/long)则直接使用即可。 - 确保
confirm_duration是数值类型(integer/float/double等),否则无法计算平均值。如果字段类型不对,需要先修改映射或者重新索引数据。 - 如果需要查看更多餐厅的结果,调整
terms聚合里的size参数即可(默认仅返回前10条)。
内容的提问来源于stack exchange,提问作者Ravindra Yadav
相关产品推荐
相关产品推荐

