You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ElasticSearch中按restaurant_id分组展示订单确认平均时长?

按restaurant_id分组计算订单确认平均时长的实现方案

Hey there! 作为ES新手,你提的这个需求完全可以通过Elasticsearch的**聚合(Aggregation)**功能实现,这正是聚合擅长的分组统计场景~

核心思路

我们需要两步聚合来达成目标:

  1. 用terms聚合按restaurant_id对订单进行分组
  2. 在每个分组内,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:10:18