diff --git a/dspace-discovery/dspace-discovery-provider/src/main/java/org/dspace/discovery/SearchUtils.java b/dspace-discovery/dspace-discovery-provider/src/main/java/org/dspace/discovery/SearchUtils.java index cafa9f2138..3307e669db 100644 --- a/dspace-discovery/dspace-discovery-provider/src/main/java/org/dspace/discovery/SearchUtils.java +++ b/dspace-discovery/dspace-discovery-provider/src/main/java/org/dspace/discovery/SearchUtils.java @@ -44,6 +44,8 @@ public class SearchUtils { private static List dateIndexableFields = new ArrayList(); + public static final String FILTER_SEPARATOR = "|||"; + static { log.debug("loading configuration"); @@ -190,6 +192,20 @@ public class SearchUtils { return dateIndexableFields; } + public static String getFilterQueryDisplay(String filterQuery){ + String separator = SearchUtils.getConfig().getString("solr.facets.split.char", SearchUtils.FILTER_SEPARATOR); + //Escape any regex chars + separator = java.util.regex.Pattern.quote(separator); + String[] fqParts = filterQuery.split(separator); + String result = ""; + int start = fqParts.length / 2; + for(int i = start; i < fqParts.length; i++){ + result += fqParts[i]; + } + + return result; + } + public static class SolrFacetConfig { private String facetField; diff --git a/dspace-discovery/dspace-discovery-provider/src/main/java/org/dspace/discovery/SolrServiceImpl.java b/dspace-discovery/dspace-discovery-provider/src/main/java/org/dspace/discovery/SolrServiceImpl.java index 13875798f2..8ebf290232 100644 --- a/dspace-discovery/dspace-discovery-provider/src/main/java/org/dspace/discovery/SolrServiceImpl.java +++ b/dspace-discovery/dspace-discovery-provider/src/main/java/org/dspace/discovery/SolrServiceImpl.java @@ -700,7 +700,10 @@ public class SolrServiceImpl implements SearchService, IndexingService { if(SearchUtils.getAllFacets().contains(field) || SearchUtils.getAllFacets().contains(unqualifiedField + "." + Item.ANY)){ //Add a special filter - doc.addField(field + "_filter", value); + //We use a separator to split up the lowercase and regular case, this is needed to get our filters in regular case + //Solr has issues with facet prefix and cases + String separator = SearchUtils.getConfig().getString("solr.facets.split.char", SearchUtils.FILTER_SEPARATOR); + doc.addField(field + "_filter", value.toLowerCase() + separator + value); } if(SearchUtils.getSortFields().contains(field) && !sortFieldsAdded.contains(field)){ diff --git a/dspace-discovery/dspace-discovery-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/discovery/AbstractFiltersTransformer.java b/dspace-discovery/dspace-discovery-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/discovery/AbstractFiltersTransformer.java index 9bf2db7420..b66229ea64 100644 --- a/dspace-discovery/dspace-discovery-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/discovery/AbstractFiltersTransformer.java +++ b/dspace-discovery/dspace-discovery-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/discovery/AbstractFiltersTransformer.java @@ -37,7 +37,6 @@ import org.xml.sax.SAXException; import java.io.IOException; import java.io.Serializable; -import java.net.URLEncoder; import java.sql.SQLException; import java.util.*; import java.util.regex.Matcher; @@ -386,7 +385,7 @@ public abstract class AbstractFiltersTransformer extends AbstractDSpaceTransform continue; } for (FacetField.Count count : facetVals) { - values.add(new FilterDisplayValue(count.getName(), count.getCount(), count.getAsFilterQuery())); + values.add(new FilterDisplayValue(SearchUtils.getFilterQueryDisplay(count.getName()), count.getCount(), count.getAsFilterQuery())); } } if(field.isDate()){ @@ -463,9 +462,12 @@ public abstract class AbstractFiltersTransformer extends AbstractDSpaceTransform if(keys != null){ while (keys.hasMoreElements()){ String key = (String) keys.nextElement(); - if(key != null){ - paramsQuery += key + "=" + URLEncoder.encode(request.getParameter(key), "UTF-8"); - paramsQuery += "&"; + if(key != null && !"page".equals(key)){ + String[] vals = request.getParameterValues(key); + for(String paramValue : vals){ + paramsQuery += key + "=" + paramValue; + paramsQuery += "&"; + } } } } @@ -476,7 +478,7 @@ public abstract class AbstractFiltersTransformer extends AbstractDSpaceTransform "/discover?" + paramsQuery + "fq=" + - URLEncoder.encode(filterQuery, "UTF-8"), + filterQuery, displayedValue + " (" + value.getCount() + ")" ); } diff --git a/dspace-discovery/dspace-discovery-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/discovery/SearchFacetFilter.java b/dspace-discovery/dspace-discovery-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/discovery/SearchFacetFilter.java index 5d0d5928c9..6f99a380d4 100644 --- a/dspace-discovery/dspace-discovery-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/discovery/SearchFacetFilter.java +++ b/dspace-discovery/dspace-discovery-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/discovery/SearchFacetFilter.java @@ -558,7 +558,7 @@ public class SearchFacetFilter extends AbstractDSpaceTransformer implements Cach //No use in selecting the same filter twice if(filterQueries.contains(filterQuery)){ - cell.addContent(displayedValue + " (" + value.getCount() + ")"); + cell.addContent(SearchUtils.getFilterQueryDisplay(displayedValue) + " (" + value.getCount() + ")"); } else { //Add the basics Map urlParams = new HashMap(); @@ -567,8 +567,8 @@ public class SearchFacetFilter extends AbstractDSpaceTransformer implements Cach //Add already existing filter queries url = addFilterQueriesToUrl(url); //Last add the current filter query - url += "&fq=" + URLEncoder.encode(filterQuery, "UTF-8"); - cell.addXref(url, displayedValue + " (" + value.getCount() + ")" + url += "&fq=" + filterQuery; + cell.addXref(url, SearchUtils.getFilterQueryDisplay(displayedValue) + " (" + value.getCount() + ")" ); } } diff --git a/dspace-discovery/dspace-discovery-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/discovery/SimpleSearch.java b/dspace-discovery/dspace-discovery-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/discovery/SimpleSearch.java index c4f7158169..ee3d254b2b 100644 --- a/dspace-discovery/dspace-discovery-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/discovery/SimpleSearch.java +++ b/dspace-discovery/dspace-discovery-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/discovery/SimpleSearch.java @@ -166,6 +166,9 @@ public class SimpleSearch extends AbstractSearch implements CacheableProcessingC if(field.equals("location.comm") || field.equals("location.coll")){ //We have a community/collection, resolve it to a dspaceObject value = SolrServiceImpl.locationToName(context, field, value); + } else + if(field.endsWith("_filter")){ + value = SearchUtils.getFilterQueryDisplay(value); } //Check for a range query Pattern pattern = Pattern.compile("\\[(.*? TO .*?)\\]"); diff --git a/dspace/solr/search/conf/schema.xml b/dspace/solr/search/conf/schema.xml index 5044f46be6..5a00ccefde 100644 --- a/dspace/solr/search/conf/schema.xml +++ b/dspace/solr/search/conf/schema.xml @@ -480,7 +480,7 @@ - +