Elastic aggregation to identify period A vs B percentage increases

Viewed 589

I have some daily sales data indexed into Elasticsearch. I successfully run a number of aggregations to identify top sellers across a date range etc.

I am now trying to write a single query to do the following:

  • Identify Top n sellers over a date range (Period A)
  • Take the results of Period A and sum sales for these products over second date range (Period B)
  • Compare sales in period A to Period B and identify those with percentage increases above X%.

My attempt so far:

{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "date": {
              "gte": "2017-10-01",
              "lte": "2017-10-14"
            }
          }
        }
      ]
    }
  },
  "size": 0,
  "aggs": {
    "data_split": {
      "terms": {
        "size": 10,
        "field": "product_id"
      },
      "aggs": {
        "date_periods": {
          "date_range": {
            "field": "date",
            "format": "YYYY-MM-dd",
            "ranges": [
              {
                "from": "2017-10-01",
                "to": "2017-10-07"
              },
              {
                "from": "2017-10-08",
                "to": "2017-10-14"
              }
            ]
          },
          "aggs": {
            "product_id_split": {
              "terms": {
                "field": "product_id"
              },
              "aggs": {
                "unit_sum": {
                  "sum": {
                    "field": "units"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Although this outputs results for two periods, I don't think this is quite what I want as the initial filter is running from Period A start date to Period B end date and I think summing results for that range instead of Period A only. I also don't get the % comparison, I would probably do this at my application level, but I understand could be handled with a scripted Elastic query?

It would be especially awesome if instead of top n results in period A, I could set a sales threshold of say 1,000 sales.

Any pointers would be much appreciated. Thanks in advance!

Currently running Elastic 5.6

1 Answers
Related