diff --git a/src/main/java/org/codelibs/fess/entity/FacetInfo.java b/src/main/java/org/codelibs/fess/entity/FacetInfo.java index f4b17972b..66e890713 100644 --- a/src/main/java/org/codelibs/fess/entity/FacetInfo.java +++ b/src/main/java/org/codelibs/fess/entity/FacetInfo.java @@ -17,6 +17,9 @@ package org.codelibs.fess.entity; import java.util.Arrays; +import org.codelibs.core.lang.StringUtil; +import org.elasticsearch.search.aggregations.BucketOrder; + public class FacetInfo { public String[] field; @@ -30,6 +33,26 @@ public class FacetInfo { public String missing; + public BucketOrder getBucketOrder() { + if (StringUtil.isNotBlank(sort)) { + final String[] values = sort.split("\\."); + final boolean asc; + if (values.length > 1) { + asc = !values[1].equalsIgnoreCase("desc"); + } else { + asc = true; + } + if (values.length > 0) { + if ("term".equals(values[0]) || "key".equals(values[0])) { + return BucketOrder.key(asc); + } else if ("count".equals(values[0])) { + return BucketOrder.count(asc); + } + } + } + return BucketOrder.count(false); + } + @Override public String toString() { return "FacetInfo [field=" + Arrays.toString(field) + ", query=" + Arrays.toString(query) + ", size=" + size + ", minDocCount=" diff --git a/src/main/java/org/codelibs/fess/es/client/FessEsClient.java b/src/main/java/org/codelibs/fess/es/client/FessEsClient.java index dd2b92341..494233ea9 100644 --- a/src/main/java/org/codelibs/fess/es/client/FessEsClient.java +++ b/src/main/java/org/codelibs/fess/es/client/FessEsClient.java @@ -1114,11 +1114,7 @@ public class FessEsClient implements Client { final String encodedField = BaseEncoding.base64().encode(f.getBytes(StandardCharsets.UTF_8)); final TermsAggregationBuilder termsBuilder = AggregationBuilders.terms(Constants.FACET_FIELD_PREFIX + encodedField).field(f); - if ("term".equals(facetInfo.sort) || "key".equals(facetInfo.sort)) { - termsBuilder.order(BucketOrder.key(true)); - } else if ("count".equals(facetInfo.sort)) { - termsBuilder.order(BucketOrder.count(true)); - } + termsBuilder.order(facetInfo.getBucketOrder()); if (facetInfo.size != null) { termsBuilder.size(facetInfo.size); } diff --git a/src/main/java/org/codelibs/fess/util/FacetResponse.java b/src/main/java/org/codelibs/fess/util/FacetResponse.java index 5d58b0662..8543596e2 100644 --- a/src/main/java/org/codelibs/fess/util/FacetResponse.java +++ b/src/main/java/org/codelibs/fess/util/FacetResponse.java @@ -55,7 +55,7 @@ public class FacetResponse { } public static class Field { - protected Map valueCountMap = new HashMap<>(); + protected Map valueCountMap = new LinkedHashMap<>(); protected String name; diff --git a/src/main/resources/app.xml b/src/main/resources/app.xml index 0e8048d71..8fcb5e844 100644 --- a/src/main/resources/app.xml +++ b/src/main/resources/app.xml @@ -43,6 +43,7 @@ org.apache.lucene.queryparser.classic.QueryParser$Operator.AND + "count.desc" 100 1 ["label"]