22
22
import org .elasticsearch .index .query .QueryBuilder ;
23
23
import org .elasticsearch .index .query .QueryBuilders ;
24
24
import 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 ;
25
29
import org .elasticsearch .search .facet .FacetBuilder ;
26
30
import org .elasticsearch .search .sort .FieldSortBuilder ;
27
31
import org .elasticsearch .search .sort .SortBuilders ;
@@ -493,20 +497,33 @@ private void addFilters(SearchRequestBuilder searchRequestBuilder, FilterBuilder
493
497
}
494
498
if (facets ) {
495
499
if (filters == null ) {
496
- addFacets (new HashMap <String , String []>(), clazz .getName (), searchRequestBuilder , filter );
500
+ addAggregations (new HashMap <String , String []>(), clazz .getName (), searchRequestBuilder , filter );
497
501
} else {
498
- addFacets (filters , clazz .getName (), searchRequestBuilder , filter );
502
+ addAggregations (filters , clazz .getName (), searchRequestBuilder , filter );
499
503
}
500
504
}
501
505
}
502
506
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 );
508
520
}
509
- searchRequestBuilder .addFacet (facet );
521
+
522
+ for (AggregationBuilder aggregation : aggregations ) {
523
+ aggregationBuilder .subAggregation (aggregation );
524
+ }
525
+
526
+ searchRequestBuilder .addAggregation (aggregationBuilder );
510
527
}
511
528
}
512
529
@@ -566,7 +583,7 @@ private FilterBuilder getAndFilter(List<FilterBuilder> filters) {
566
583
567
584
/**
568
585
* Create a list of facets for the given type.
569
- *
586
+ *
570
587
* @param className The name of the class for which to create facets.
571
588
* @param filters The set of facets to exclude from the facet creation.
572
589
* @return a {@link List} of {@link FacetBuilder facet builders}.
@@ -582,9 +599,33 @@ private List<FacetBuilder> buildFacets(String className, Set<String> filters) {
582
599
for (IFacetBuilderHelper facetBuilderHelper : facetBuilderHelpers ) {
583
600
if (filters == null || !filters .contains (facetBuilderHelper .getEsFieldName ())) {
584
601
facetBuilders .add (facetBuilderHelper .buildFacet ());
602
+
585
603
}
586
604
}
587
605
return facetBuilders ;
588
606
}
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
+ }
589
630
}
590
631
}
0 commit comments