0

I want to generate similar query using Elasticsearch JAVA API . I am trying to apply filters at an aggregation level.

{
    "query":{
        "filtered":{
            "filter":{ "terms":{ "family_name":"Brown" } } //filter_1
        }
    },
    "aggs":{
        "young_age":{
            "filter":{
                "terms" : {
                   "gender" : "male" //filter_2
                 } 
            },
            "aggs":{
                "age":{
                    "terms":{
                        "field":"age"
                    }
                }
            }
        }
    }
}

Please find the sample code that i am up to

TermFilterBuilder family_filter_1 = FilterBuilders.termFilter("family_name","Brown");

FilteredQueryBuilder qbuilder =QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),family_filter_1);


SearchRequestBuilder search  = client.prepareSearch("test_index")
.setTypes("test_type")
.setSearchType(SearchType.COUNT)
.setQuery(qbuilder);

search.addAggregation(terms("age").field("age") 
.size(0)// Size 0 returns all the "group by keys"
.order(Terms.Order.count(true))); // to sort the output 

System.out.println(""+search);

and response i am getting . Please suggest how to add filter_2

{
  "query" : {
    "filtered" : {
      "query" : {
        "match_all" : { }
      },
      "filter" : {
        "term" : {
          "family_name" : "Brown"
        }
      }
    }
  },
  "aggregations" : {
    "age" : {
      "terms" : {
        "field" : "age",
        "size" : 0,
        "order" : {
          "_count" : "asc"
        }
      }
    }
  }
}

Thanks in advance..

2
  • You're missing the name of the field on which the range filter aggregation is run, i.e. the field on which filter_2 is run. Commented Nov 17, 2015 at 4:49
  • @val That's just for an example... Modified the question.. Thanks Commented Nov 17, 2015 at 4:54

1 Answer 1

1

You can do it like this:

// same as your code
TermFilterBuilder family_filter_1 = ...;
FilteredQueryBuilder qbuilder = ...;
SearchRequestBuilder search = ...;

// build the range filter
RangeQuery ageRange = QueryBuilders.rangeQuery("age")
    .from(18).to(40).includeLower(false).includeUpper(false);

// build the terms sub-aggregation
TermsAggregation age = AggregationBuilders.terms("age")
    .field("age") 
    .size(0)
    .order(Terms.Order.count(true));

// build the filter top-aggregation
FilterAggregationBuilder youngAge = AggregationBuilders
    .filter("young_age")
    .filter(ageRange)
    .subAggregation(age);


search.addAggregation(youngAge);
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for AggregationBuilders logic

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.