Example 1 – REST:
GET /INDEX/TYPE/_search { "size": 0, "aggs": { "FILTER_NAME": { "filter": { "script": { "script": "doc['field1'].value < doc['field2'].value" } } } } }
Example 1 – Java API:
SearchRequestBuilder searchRequestBuilder = esClient .prepareSearch("INDEX) .setTypes("TYPE") .setSize(0) .addAggregation( AggregationBuilders.filter("FILTER_NAME").filter(FilterBuilders.scriptFilter("doc['filed1'].value > doc['field2'].value"))); SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); Map<String, Aggregation> aggMap = searchResponse.getAggregations().asMap(); InternalFilter filter = (InternalFilter) aggMap.get("FILTER_NAME"); System.out.println(filter.getDocCount());
Example 2 – REST:
GET /INDEX/TYPE/_search { "size": 0, "aggs": { "AGGREGATION_NAME": { "terms": { "field": "field1", "size": 10 }, "aggs": { "SUB_AGGREGATION_NAME": { "filter": { "script": { "script": "doc['field2'].value < doc['field3'].value" } } } } } } }
Example 2 – Java API:
SearchRequestBuilder searchRequestBuilder = esClient .prepareSearch("INDEX") .setTypes("TYPE") .setQuery(query) .setSize(0) .addAggregation( AggregationBuilders.terms("AGGREGATION_NAME") .field("field1") .size(999999) .subAggregation( AggregationBuilders.filter("SUB_AGGREGATION_NAME").filter(FilterBuilders.scriptFilter("doc['field2'].value > doc['field3'].value")))); SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); Map<String, Aggregation> aggMap = searchResponse.getAggregations().asMap(); StringTerms terms = (StringTerms) aggMap.get("AGGREGATION_NAME"); List bucketList = terms.getBuckets(); for (Bucket bucket : bucketList) { InternalFilter filter= bucket.getAggregations().get("SUB_AGGREGATION_NAME"); System.out.println(bucket.getKey()+":"+filter.getDocCount()); }