New

The executive guide to generative AI

Read more
IMPORTANT: This documentation is no longer updated. Refer to Elastic's version policy and the latest documentation.

Moving Function Aggregation Usage

edit

Given an ordered series of data, the Moving Function aggregation will slide a window across the data and allow the user to specify a custom script that is executed on each window of data. For convenience, a number of common functions are predefined such as min/max, moving averages, etc.

This is conceptually very similar to the Moving Average pipeline aggregation, except it provides more functionality.

Only available in Elasticsearch 6.4.0+

Be sure to read the Elasticsearch documentation on Moving Function Aggregation

Fluent DSL example

edit
a => a
.DateHistogram("projects_started_per_month", dh => dh
    .Field(p => p.StartedOn)
    .Interval(DateInterval.Month)
    .Aggregations(aa => aa
        .Sum("commits", sm => sm
            .Field(p => p.NumberOfCommits)
        )
        .MovingFunction("commits_moving_avg", mv => mv
            .BucketsPath("commits")
            .Window(30)
            .Script("MovingFunctions.unweightedAvg(values)")
        )
    )
)

Object Initializer syntax example

edit
new DateHistogramAggregation("projects_started_per_month")
{
    Field = "startedOn",
    Interval = DateInterval.Month,
    Aggregations =
        new SumAggregation("commits", "numberOfCommits")
        && new MovingFunctionAggregation("commits_moving_avg", "commits")
        {
            Window = 30,
            Script = "MovingFunctions.unweightedAvg(values)"
        }
}

Example json output.

{
  "projects_started_per_month": {
    "date_histogram": {
      "field": "startedOn",
      "interval": "month"
    },
    "aggs": {
      "commits": {
        "sum": {
          "field": "numberOfCommits"
        }
      },
      "commits_moving_avg": {
        "moving_fn": {
          "buckets_path": "commits",
          "window": 30,
          "script": "MovingFunctions.unweightedAvg(values)"
        }
      }
    }
  }
}

Handling Responses

edit
response.ShouldBeValid();

var projectsPerMonth = response.Aggregations.DateHistogram("projects_started_per_month");
projectsPerMonth.Should().NotBeNull();
projectsPerMonth.Buckets.Should().NotBeNull();
projectsPerMonth.Buckets.Count.Should().BeGreaterThan(0);

// average not calculated for the first bucket
foreach (var item in projectsPerMonth.Buckets.Skip(1))
{
    if (item.DocCount == 0) continue;
    var movingAvg = item.Sum("commits_moving_avg");
    movingAvg.Should().NotBeNull();
    movingAvg.Value.Should().BeGreaterThan(0);
}
Was this helpful?
Feedback