Custom sorting of faceted navigation
Introduction
The category values in faceted navigation are sorted server side based on the facet
's configuration which can be configured from the facet UI.
Custom sorting
If none of the built in ways of sorting are suitable, it is possible to implement your own custom sort order. To do this, a three step process is required:
- Write a groovy script or compile a custom comparator in
java
. - Enable the custom comparator on the facet in the
hook_post_process.groovy
hook script. - Choose when the custom comparator should apply in the faceted navigation user interface.
Implement the comparator
Comparators need to implement a java.util.Comparator
. Here is an example of comparator which sorts on label
.
package com.foo;
import java.util.Comparator;
import com.funnelback.publicui.search.model.transaction.Facet.CategoryValue;
public class MyComparator implements Comparator<CategoryValue> {
@Override
public int compare(CategoryValue o1, CategoryValue o2) {
// lowercase the label as we don't want the sort to be case sensitive.
return o1.getLabel().toLowerCase().compareTo(o2.getLabel().toLowerCase());
}
}
We could place our code in file:
$SEARCH_HOME/conf/<collection>/@groovy/com/foo/MyComparator.groovy
The @groovy/com/foo
path may need to be created.
Set the comparator on the facet
We will need to set the comparator on the facet in the hook_post_process.groovy hook script. To do this we will create or modify the file:
$SEARCH_HOME/conf/<collection>/hook_post_process.groovy
to contain:
import com.funnelback.publicui.search.model.transaction.Facet;
for(Facet facet : transaction.getResponse().getFacets()) {
// Find the facet we want to set our comparator on.
if("Authors".equals(facet.getName())) {
facet.setCustomComparator(new com.foo.MyComparator());
}
}
Update the facet config to use the custom comparator
The facet configuration will need to be updated to include the CUSTOM_COMPARATOR
sort order, this can be done with the facet editor UI. The custom sort may be used with other predefined sorting methods for example you can sort by count then by your custom comparator.
Caveats
The data model returned by search endpoint will contain both response.facets[i].categories[n].values
and response.facets[i].allValues
. The former is a deprecated set of values that are returned to be compatible with previous versions of Funnelback which did not support this type of custom sorting. Only response.facets[i].allValues
will have the custom sort applied and references to response.facets[i].categories[n].values
should be updated to use the newer response.facets[i].allValues
list instead.