Date Range Aggregation Usageedit

A range aggregation that is dedicated for date values. The main difference between this aggregation and the normal range aggregation is that the from and to values can be expressed in DateMath expressions, and it is also possible to specify a date format by which the from and to response fields will be returned.

this aggregation includes the from value and excludes the to value for each range.

Be sure to read the Elasticsearch documentation on Date Range Aggregation

Fluent DSL exampleedit

a => a
.DateRange("projects_date_ranges", date => date
    .Field(p => p.StartedOn)
    .Ranges(
        r => r.From(DateMath.Anchored(FixedDate).Add("2d")).To(DateMath.Now),
        r => r.To(DateMath.Now.Add(TimeSpan.FromDays(1)).Subtract("30m").RoundTo(DateMathTimeUnit.Hour)),
        r => r.From(DateMath.Anchored("2012-05-05").Add(TimeSpan.FromDays(1)).Subtract("1m"))
    )
    .TimeZone("CET")
    .Aggregations(childAggs => childAggs
        .Terms("project_tags", avg => avg.Field(p => p.Tags))
    )
)

Object Initializer syntax exampleedit

new DateRangeAggregation("projects_date_ranges")
{
    Field = Field<Project>(p => p.StartedOn),
    Ranges = new List<DateRangeExpression>
    {
        new DateRangeExpression { From = DateMath.Anchored(FixedDate).Add("2d"), To = DateMath.Now },
        new DateRangeExpression { To = DateMath.Now.Add(TimeSpan.FromDays(1)).Subtract("30m").RoundTo(DateMathTimeUnit.Hour) },
        new DateRangeExpression { From = DateMath.Anchored("2012-05-05").Add(TimeSpan.FromDays(1)).Subtract("1m") }
    },
    TimeZone = "CET",
    Aggregations =
        new TermsAggregation("project_tags") { Field = Field<Project>(p => p.Tags) }
}

Example json output.

{
  "projects_date_ranges": {
    "date_range": {
      "field": "startedOn",
      "ranges": [
        {
          "to": "now",
          "from": "2015-06-06T12:01:02.123||+2d"
        },
        {
          "to": "now+1d-30m/h"
        },
        {
          "from": "2012-05-05||+1d-1m"
        }
      ],
      "time_zone": "CET"
    },
    "aggs": {
      "project_tags": {
        "terms": {
          "field": "tags"
        }
      }
    }
  }
}

Handling Responsesedit

The AggregateDictionary found on `.Aggregations on SearchResponse<T> has several helper methods so we can fetch our aggregation results easily in the correct type. Be sure to read more about these helper methods

response.ShouldBeValid();

var dateHistogram = response.Aggregations.DateRange("projects_date_ranges");
dateHistogram.Should().NotBeNull();
dateHistogram.Buckets.Should().NotBeNull();

We specified three ranges so we expect to have three of them in the response

dateHistogram.Buckets.Count.Should().Be(3);
foreach (var item in dateHistogram.Buckets) item.DocCount.Should().BeGreaterThan(0);