簡體   English   中英

Elasticsearch,如何每天每小時獲得訂單

[英]Elasticsearch, how to get orders per hour per day

我有包含 ubereats 訂單數據的文件。 我想知道每天每小時的平均訂單量。 該文件包含 52 周的訂單數據。 我設法在每個星期一、星期二等處獲得每小時的數據。但是還沒有設法在星期一、星期二等處獲得每小時的平均訂單。

search_body = {
    "size": 0,
    "aggs": {
        "total_orders_per_day_of_week": {
            "terms": {
                "script": {
                    "lang": "painless",
                    "source": "doc['dateTime'].value.dayOfWeek"
                }
            },
        "aggs": {
            "countPerHour": {
                "terms": {
                    "size": 24,
                    "script": "return doc['dateTime'].value.getHour();"
                }
            }
         }
      }
    }
}

也許我需要做一些事情來計算每天的平均訂單?

search_body = {
    "size" : 0,
    "aggs" : {
        "orders_per_day" : {
            "terms" : {
                "script" : {
                    "lang": "painless",
                    "source": "doc['dateTime'].value.dayOfWeek"
                }
            },
            "aggs" : {
                "numberOfOccurrences" : {
                    "cardinality": {
                        "script" : {
                            "lang": "painless",
                            "source": "doc['dateTime'].value.dayOfYear"
                        }
                    }
                }
            },
        }
    }
}
for day in result["aggregations"]["orders_per_day"]["buckets"]:
    print (day["key"], day["doc_count"], day["numberOfOccurrences"]["value"],
        day["doc_count"]/day["numberOfOccurrences"]["value"])

如果我這次理解正確,您希望獲得星期一、星期二每小時的平均值……所以應該有 24x7 的結果。 如果是這樣,請執行以下操作:

{
  "size": 0,
  "aggs": {
    "orders_per_hour_of_day": {
      "terms": {
        "script" : {
            "lang": "painless",
            "source": "doc['dateTime'].value.getHour()"
        },
        "size": 24
      },
      "aggs": {
        "total_orders_per_day_of_week": {
          "terms": {
            "script": {
              "lang": "painless",
              "source": "doc['dateTime'].value.getDayOfWeekEnum()"
            }
          },
          "aggs": {
            "number_of_weeks": {
              "date_histogram": {
                "field": "dateTime",
                "calendar_interval": "week"
              }
            },
            "average_orders_per_hour_day_of_week": {
              "bucket_script": {
                "buckets_path": {
                  "doc_count": "_count",
                  "number_of_weeks": "number_of_weeks._bucket_count"
                },
                "script": "params.doc_count / params.number_of_weeks"
              }
            }
          }
        }
      }
    }
  }
}

從這里改編的代碼: https : //discuss.elastic.co/t/average-per-day-of-week-aggregation/124132


我不確定我是否清楚地理解你的問題。 聽起來您想要獲得周一、周二、...周日的平均訂單。 如果這是問題,您可以將每個存儲桶划分為 24 小時。

{
  "size": 0,
  "aggs": {
    "orders_per_day": {
      "terms": {
        "script": {
          "lang": "painless",
          "source": "doc['dateTime'].value.dayOfWeek"
        }
      },
      "aggs": {
        "avg_per_hour": {
          "bucket_script": {
            "buckets_path": {
              "count": "_count"
            },
            "script": "params.count / 24"
          }
        }
      }
    }
  }
}

桶聚合:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-bucket-script-aggregation.html
存儲桶 doc_count 的路徑:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline.html#_special_paths

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM