Filter Aggregation Usage

edit

Defines a single bucket of all the documents in the current document set context that match a specified filter. Often this will be used to narrow down the current aggregation context to a specific set of documents.

Be sure to read the Elasticsearch documentation on Filter Aggregation

Fluent DSL example

edit
s => s
.Aggregations(aggs => aggs
    .Filter("bethels_projects", date => date
        .Filter(q => q.Term(p => p.LeadDeveloper.FirstName, FirstNameToFind))
        .Aggregations(childAggs => childAggs
            .Terms("project_tags", avg => avg.Field(p => p.CuratedTags.First().Name.Suffix("keyword")))
        )
    )
)

Object Initializer syntax example

edit
new SearchRequest<Project>
{
    Aggregations = new FilterAggregation("bethels_projects")
    {
        Filter = new TermQuery { Field = Field<Project>(p => p.LeadDeveloper.FirstName), Value = FirstNameToFind },
        Aggregations =
            new TermsAggregation("project_tags") { Field = Field<Project>(p => p.CuratedTags.First().Name.Suffix("keyword")) }
    }
}

Example json output.

{
  "aggs": {
    "bethels_projects": {
      "filter": {
        "term": {
          "leadDeveloper.firstName": {
            "value": "pierce"
          }
        }
      },
      "aggs": {
        "project_tags": {
          "terms": {
            "field": "curatedTags.name.keyword"
          }
        }
      }
    }
  }
}

Handling Responses

edit

Using the .Aggs 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 filterAgg = response.Aggs.Filter("bethels_projects");
filterAgg.Should().NotBeNull();
filterAgg.DocCount.Should().BeGreaterThan(0);
var tags = filterAgg.Terms("project_tags");
tags.Should().NotBeNull();
tags.Buckets.Should().NotBeEmpty();

Empty Filter

edit

When the collection of filters is empty or all are conditionless, NEST will serialize them to an empty object.

Fluent DSL example

edit
s => s
.Aggregations(aggs => aggs
    .Filter("empty_filter", date => date
        .Filter(f => f
            .Bool(b => b
                .Filter(new QueryContainer[0])
            )
        )
    )
)

Object Initializer syntax example

edit
new SearchRequest<Project>
{
    Aggregations = new FilterAggregation("empty_filter")
    {
        Filter = new BoolQuery
        {
            Filter = new List<QueryContainer>()
        }
    }
}

Example json output.

{
  "aggs": {
    "empty_filter": {
      "filter": {}
    }
  }
}

Handling Responses

edit
response.ShouldBeValid();
response.Aggs.Filter("empty_filter").DocCount.Should().BeGreaterThan(0);