2222import org .elasticsearch .index .query .QueryBuilder ;
2323import org .elasticsearch .index .query .QueryBuilders ;
2424import org .elasticsearch .index .query .functionscore .ScoreFunctionBuilders ;
25+ import org .elasticsearch .search .aggregations .AggregationBuilder ;
26+ import org .elasticsearch .search .aggregations .AggregationBuilders ;
27+ import org .elasticsearch .search .aggregations .bucket .filters .FiltersAggregationBuilder ;
28+ import org .elasticsearch .search .aggregations .metrics .MetricsAggregationBuilder ;
2529import org .elasticsearch .search .facet .FacetBuilder ;
2630import org .elasticsearch .search .sort .FieldSortBuilder ;
2731import org .elasticsearch .search .sort .SortBuilders ;
@@ -493,20 +497,33 @@ private void addFilters(SearchRequestBuilder searchRequestBuilder, FilterBuilder
493497 }
494498 if (facets ) {
495499 if (filters == null ) {
496- addFacets (new HashMap <String , String []>(), clazz .getName (), searchRequestBuilder , filter );
500+ addAggregations (new HashMap <String , String []>(), clazz .getName (), searchRequestBuilder , filter );
497501 } else {
498- addFacets (filters , clazz .getName (), searchRequestBuilder , filter );
502+ addAggregations (filters , clazz .getName (), searchRequestBuilder , filter );
499503 }
500504 }
501505 }
502506
503- private void addFacets (Map <String , String []> filters , String className , SearchRequestBuilder searchRequestBuilder , FilterBuilder filter ) {
504- final List <FacetBuilder > facets = buildFacets (className , filters .keySet ());
505- for (final FacetBuilder facet : facets ) {
506- if (filter != null ) {
507- facet .facetFilter (filter );
507+ private void addAggregations (Map <String , String []> filters , String className , SearchRequestBuilder searchRequestBuilder , FilterBuilder filter ) {
508+ final List <AggregationBuilder > aggregations = buildAggregations (className , filters .keySet ());
509+
510+ if (aggregations .size () > 0 ) {
511+ AggregationBuilder aggregationBuilder ;
512+
513+ if (filter == null ){
514+ // In order to gather all unfiltered aggregations faceted results under one single parent aggregation, a Global Aggregation is used
515+ aggregationBuilder = AggregationBuilders .global ("global_aggregation" );
516+ }
517+ else {
518+ // To include filters inside filtered aggregation results
519+ aggregationBuilder = AggregationBuilders .filters ("filter_aggregation" ).filter (filter );
508520 }
509- searchRequestBuilder .addFacet (facet );
521+
522+ for (AggregationBuilder aggregation : aggregations ) {
523+ aggregationBuilder .subAggregation (aggregation );
524+ }
525+
526+ searchRequestBuilder .addAggregation (aggregationBuilder );
510527 }
511528 }
512529
@@ -566,7 +583,7 @@ private FilterBuilder getAndFilter(List<FilterBuilder> filters) {
566583
567584 /**
568585 * Create a list of facets for the given type.
569- *
586+ *
570587 * @param className The name of the class for which to create facets.
571588 * @param filters The set of facets to exclude from the facet creation.
572589 * @return a {@link List} of {@link FacetBuilder facet builders}.
@@ -582,9 +599,33 @@ private List<FacetBuilder> buildFacets(String className, Set<String> filters) {
582599 for (IFacetBuilderHelper facetBuilderHelper : facetBuilderHelpers ) {
583600 if (filters == null || !filters .contains (facetBuilderHelper .getEsFieldName ())) {
584601 facetBuilders .add (facetBuilderHelper .buildFacet ());
602+
585603 }
586604 }
587605 return facetBuilders ;
588606 }
607+
608+ /**
609+ * Create a list of aggregations counts for the given type.
610+ *
611+ * @param className The name of the class for which to create facets.
612+ * @param filters The set of aggregations to exclude from the facet creation.
613+ * @return a {@link List} of {@link AggregationBuilder aggregation builders}.
614+ */
615+ private List <AggregationBuilder > buildAggregations (String className , Set <String > filters ) {
616+ final List <AggregationBuilder > aggregationBuilders = new ArrayList <AggregationBuilder >();
617+ List <IFacetBuilderHelper > facetBuilderHelpers = mappingBuilder .getFacets (className );
618+
619+ if (facetBuilderHelpers == null || facetBuilderHelpers .size () < 1 )
620+ return aggregationBuilders ;
621+
622+ for (IFacetBuilderHelper facetBuilderHelper : facetBuilderHelpers ) {
623+ if (filters == null || !filters .contains (facetBuilderHelper .getEsFieldName ()))
624+ aggregationBuilders .add (AggregationBuilders .terms (facetBuilderHelper .getEsFieldName ()).field (facetBuilderHelper .getEsFieldName ()));
625+ }
626+
627+ return aggregationBuilders ;
628+
629+ }
589630 }
590631}
0 commit comments