Class FacetConfigurationApplyer
- java.lang.Object
-
- de.cxp.ocs.elasticsearch.facets.FacetConfigurationApplyer
-
public class FacetConfigurationApplyer extends Object
-
-
Constructor Summary
Constructors Constructor Description FacetConfigurationApplyer(SearchContext context)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description List<org.elasticsearch.search.aggregations.AggregationBuilder>buildAggregators(FilterContext filterContext)This method uses the initialized FacetCreators to build the right aggregations in respect of the active post filters.List<Facet>getFacets(org.elasticsearch.search.aggregations.Aggregations aggregations, long matchCount, FilterContext filterContext, SearchQueryBuilder linkBuilder)
-
-
-
Constructor Detail
-
FacetConfigurationApplyer
public FacetConfigurationApplyer(SearchContext context)
-
-
Method Detail
-
buildAggregators
public List<org.elasticsearch.search.aggregations.AggregationBuilder> buildAggregators(FilterContext filterContext)
This method uses the initialized FacetCreators to build the right aggregations in respect of the active post filters.
Background / Details:For facets that should stay the same, even if one of its filters was selected ("multi-select-facets"), the post filtering feature is used. This way such facets can be created without their active filter. See Elasticsearch post filter documentation
However this leads to the problem, that other facets are also not filtered, although they should be. Otherwise they may present filters that lead to 0 results in combination with the active post filter/s.
The (only) solution is to apply the post filters for all those other aggregations as well, but of course not for the aggregation of the active post filter. This gets complicated if there are several post filters for different multi-select-facets. In that case each according aggregation needs to be filtered with the other post filters but not the related one.
Example:"brand" and "price" are configured to be multi-select-facets. If for both facets a filter is applied, the "brand" aggregation must consider the "price" filter and the "price" aggregation must consider the "brand" filter. All other aggregations must consider both post filters.
More details at http://stackoverflow.com/questions/41369749
- Parameters:
filterContext- context that holds the filter queries- Returns:
- list of filtered and/or unfiltered aggregation builders depending on the existance of post filters
-
getFacets
public List<Facet> getFacets(org.elasticsearch.search.aggregations.Aggregations aggregations, long matchCount, FilterContext filterContext, SearchQueryBuilder linkBuilder)
-
-