Auto Date Histogram Aggregation Usage

edit

A multi-bucket aggregation similar to the Date Histogram Aggregation except instead of providing an interval to use as the width of each bucket, a target number of buckets is provided indicating the number of buckets needed and the interval of the buckets is automatically chosen to best achieve that target. The number of buckets returned will always be less than or equal to this target number.

When specifying a format and extended_bounds or missing, in order for Elasticsearch to be able to parse the serialized DateTime of extended_bounds or missing correctly, the date_optional_time format is included as part of the format value.

Be sure to read the Elasticsearch documentation on Auto Date Histogram Aggregation.

Fluent DSL example

edit
a => a
.AutoDateHistogram("projects_started_per_month", date => date
    .Field(p => p.StartedOn)
    .Buckets(10)
    .Format("yyyy-MM-dd'T'HH:mm:ss")
    .Missing(FixedDate)
    .Aggregations(childAggs => childAggs
        .Nested("project_tags", n => n
            .Path(p => p.Tags)
            .Aggregations(nestedAggs => nestedAggs
                .Terms("tags", avg => avg.Field(p => p.Tags.First().Name))
            )
        )
    )
)

Object Initializer syntax example

edit
new AutoDateHistogramAggregation("projects_started_per_month")
{
    Field = Field<Project>(p => p.StartedOn),
    Buckets = 10,
    Format = "yyyy-MM-dd'T'HH:mm:ss",
    Missing = FixedDate,
    Aggregations = new NestedAggregation("project_tags")
    {
        Path = Field<Project>(p => p.Tags),
        Aggregations = new TermsAggregation("tags")
        {
            Field = Field<Project>(p => p.Tags.First().Name)
        }
    }
}

Example json output.

{
  "projects_started_per_month": {
    "auto_date_histogram": {
      "field": "startedOn",
      "buckets": 10,
      "format": "yyyy-MM-dd'T'HH:mm:ss||date_optional_time", 
      "missing": "2015-06-06T12:01:02.123"
    },
    "aggs": {
      "project_tags": {
        "nested": {
          "path": "tags"
        },
        "aggs": {
          "tags": {
            "terms": {
              "field": "tags.name"
            }
          }
        }
      }
    }
  }
}

Note the inclusion of date_optional_time to format

Handling responses

edit

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.AutoDateHistogram("projects_started_per_month");
dateHistogram.Should().NotBeNull();
dateHistogram.AutoInterval.Should().NotBeNull();
dateHistogram.Buckets.Should().NotBeNull();
dateHistogram.Buckets.Count.Should().BeGreaterThan(1);
foreach (var item in dateHistogram.Buckets)
{
    item.Date.Should().NotBe(default);
    item.DocCount.Should().BeGreaterThan(0);

    var nested = item.Nested("project_tags");
    nested.Should().NotBeNull();

    var nestedTerms = nested.Terms("tags");
    nestedTerms.Buckets.Count.Should().BeGreaterThan(0);
}