diff --git a/main/plugin-web/src/org/ametys/web/frontoffice/AbstractSearchGenerator.java b/main/plugin-web/src/org/ametys/web/frontoffice/AbstractSearchGenerator.java index ce18760..b42011a 100644 --- a/main/plugin-web/src/org/ametys/web/frontoffice/AbstractSearchGenerator.java +++ b/main/plugin-web/src/org/ametys/web/frontoffice/AbstractSearchGenerator.java @@ -277,7 +277,7 @@ try { // Query - Query queryObject = getQuery(request, siteNames, language); + Query queryObject = getQuery(request, siteNames, language, null); // Filter queries Collection<Query> filterQueries = getFilterQueries(request, siteNames, language); @@ -502,10 +502,11 @@ * @param request The request * @param siteNames The site names. * @param language The language + * @param contentType The content type potentially requested * @return The query object. * @throws IllegalArgumentException If the search field is invalid. */ - protected abstract Query getQuery(Request request, Collection<String> siteNames, String language) throws IllegalArgumentException; + protected abstract Query getQuery(Request request, Collection<String> siteNames, String language, String contentType) throws IllegalArgumentException; /** * Get the filter queries from the request parameters. diff --git a/main/plugin-web/src/org/ametys/web/frontoffice/SearchGenerator.java b/main/plugin-web/src/org/ametys/web/frontoffice/SearchGenerator.java index 9d9ca1e..a4c3fdd 100644 --- a/main/plugin-web/src/org/ametys/web/frontoffice/SearchGenerator.java +++ b/main/plugin-web/src/org/ametys/web/frontoffice/SearchGenerator.java @@ -56,10 +56,10 @@ import org.ametys.cms.search.query.OrQuery; import org.ametys.cms.search.query.Query; import org.ametys.cms.search.query.Query.Operator; -import org.ametys.cms.search.solr.SearcherFactory.Searcher; import org.ametys.cms.search.query.QuerySyntaxException; import org.ametys.cms.search.query.StringQuery; import org.ametys.cms.search.query.TagQuery; +import org.ametys.cms.search.solr.SearcherFactory.Searcher; import org.ametys.cms.tag.Tag; import org.ametys.cms.tag.TagProvider; import org.ametys.plugins.explorer.resources.Resource; @@ -121,7 +121,7 @@ int count = 0; for (String cType : cTypes) { - Query queryObject = getQuery(request, siteNames, language); + Query queryObject = getQuery(request, siteNames, language, cType); Collection<Query> filterQueries = getFixedCTypeFilterQueries(request, cType, siteNames, language); @@ -222,11 +222,11 @@ } @Override - protected Query getQuery(Request request, Collection<String> siteNames, String language) throws IllegalArgumentException + protected Query getQuery(Request request, Collection<String> siteNames, String language, String contentType) throws IllegalArgumentException { List<Query> queries = new ArrayList<>(); - _addMetadataQuery(queries, language, request); + _addMetadataQuery(queries, language, request, contentType); _addTextFieldQuery(queries, language, request); _addAllWordsTextFieldQuery(queries, language, request); _addExactWordingTextFieldQuery(queries, language, request); @@ -884,8 +884,9 @@ } // the given metadata value is like the given text - private void _addMetadataQuery(Collection<Query> queries, String language, Request request) throws IllegalArgumentException + private void _addMetadataQuery(Collection<Query> queries, String language, Request request, String contentType) throws IllegalArgumentException { + ZoneItem zoneItem = (ZoneItem) request.getAttribute(org.ametys.web.repository.page.ZoneItem.class.getName()); if (zoneItem.getServiceParameters().hasMetadata("search-by-metadata")) { @@ -896,15 +897,28 @@ if (StringUtils.isNotBlank(value)) { - String escapedText = ClientUtils.escapeQueryChars(value).toLowerCase(); - if (!escapedText.startsWith("*") && !escapedText.endsWith("*")) + MetadataDefinition metadataDefinition = _contentTypesHelper.getMetadataDefinition(metadataPath, new String[] {contentType}, null); + if (metadataDefinition.getEnumerator() == null) { - escapedText = "*" + escapedText + "*"; + String escapedText = ClientUtils.escapeQueryChars(value).toLowerCase(); + if (!escapedText.startsWith("*") && !escapedText.endsWith("*")) + { + escapedText = "*" + escapedText + "*"; + } + Query query = new StringQuery(metadataPath, Operator.SEARCH, escapedText, language); + Query contentQuery = new PageContentQuery(query); + + queries.add(new OrQuery(query, contentQuery)); } - Query query = new StringQuery(metadataPath, Operator.SEARCH, escapedText, language); - Query contentQuery = new PageContentQuery(query); + else + { + String escapedText = ClientUtils.escapeQueryChars(value).toLowerCase(); + Query query = new StringQuery(metadataPath, Operator.EQ, escapedText, language); + Query contentQuery = new PageContentQuery(query); + + queries.add(new OrQuery(query, contentQuery)); + } - queries.add(new OrQuery(query, contentQuery)); } } }