Date Range Aggregation Usage

edit

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 example

edit
s => s
.Aggregations(aggs => aggs
    .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(TimeUnit.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 example

edit
new SearchRequest<Project>
{
    Aggregations = 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(TimeUnit.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.

{
  "aggs": {
    "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 Responses

edit

Using the .Agg aggregation helper we can fetch our aggregation results easily in the correct type. Be sure to read more about .Aggs vs .Aggregations

response.ShouldBeValid();

var dateHistogram = response.Aggs.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);