diff --git a/src/main/java/org/codelibs/fess/app/service/SearchService.java b/src/main/java/org/codelibs/fess/app/service/SearchService.java index 87c7e1b07..ea82910af 100644 --- a/src/main/java/org/codelibs/fess/app/service/SearchService.java +++ b/src/main/java/org/codelibs/fess/app/service/SearchService.java @@ -97,20 +97,23 @@ public class SearchService { request.setAttribute(Constants.REQUEST_QUERIES, params.getQuery()); }); - final String query = ComponentUtil.getQueryStringBuilder().params(params).build(); - final int pageStart = params.getStartPosition(); final int pageSize = params.getPageSize(); final String sortField = params.getSort(); + final String query; + if (StringUtil.isBlank(sortField)) { + query = ComponentUtil.getQueryStringBuilder().params(params).build(); + } else { + query = ComponentUtil.getQueryStringBuilder().params(params).build() + " sort:" + sortField; + } final List> documentItems = fessEsClient.search( fessConfig.getIndexDocumentSearchIndex(), fessConfig.getIndexDocumentType(), searchRequestBuilder -> { - queryHelper.processSearchPreference(searchRequestBuilder, userBean); - return SearchConditionBuilder.builder(searchRequestBuilder) - .query(StringUtil.isBlank(sortField) ? query : query + " sort:" + sortField).offset(pageStart) - .size(pageSize).facetInfo(params.getFacetInfo()).geoInfo(params.getGeoInfo()) + queryHelper.processSearchPreference(searchRequestBuilder, userBean, query); + return SearchConditionBuilder.builder(searchRequestBuilder).query(query).offset(pageStart).size(pageSize) + .facetInfo(params.getFacetInfo()).geoInfo(params.getGeoInfo()) .similarDocHash(params.getSimilarDocHash()).responseFields(queryHelper.getResponseFields()) .searchRequestType(params.getType()).build(); }, (searchRequestBuilder, execTime, searchResponse) -> { @@ -184,17 +187,20 @@ public class SearchService { request.setAttribute(Constants.REQUEST_QUERIES, params.getQuery()); }); - final String query = ComponentUtil.getQueryStringBuilder().params(params).build(); - final int pageSize = params.getPageSize(); final String sortField = params.getSort(); + final String query; + if (StringUtil.isBlank(sortField)) { + query = ComponentUtil.getQueryStringBuilder().params(params).build(); + } else { + query = ComponentUtil.getQueryStringBuilder().params(params).build() + " sort:" + sortField; + } return fessEsClient.> scrollSearch( fessConfig.getIndexDocumentSearchIndex(), fessConfig.getIndexDocumentType(), searchRequestBuilder -> { - queryHelper.processSearchPreference(searchRequestBuilder, userBean); - return SearchConditionBuilder.builder(searchRequestBuilder).scroll() - .query(StringUtil.isBlank(sortField) ? query : query + " sort:" + sortField).size(pageSize) + queryHelper.processSearchPreference(searchRequestBuilder, userBean, query); + return SearchConditionBuilder.builder(searchRequestBuilder).scroll().query(query).size(pageSize) .responseFields(queryHelper.getScrollResponseFields()).searchRequestType(params.getType()).build(); }, (searchResponse, hit) -> { @@ -296,7 +302,7 @@ public class SearchService { } builder.setQuery(boolQuery); builder.setFetchSource(fields, null); - queryHelper.processSearchPreference(builder, userBean); + queryHelper.processSearchPreference(builder, userBean, docId); return true; }); @@ -323,7 +329,7 @@ public class SearchService { builder.setQuery(boolQuery); builder.setSize(fessConfig.getPagingSearchPageMaxSizeAsInteger().intValue()); builder.setFetchSource(fields, null); - queryHelper.processSearchPreference(builder, userBean); + queryHelper.processSearchPreference(builder, userBean, String.join(StringUtil.EMPTY, docIds)); return true; }); } diff --git a/src/main/java/org/codelibs/fess/helper/QueryHelper.java b/src/main/java/org/codelibs/fess/helper/QueryHelper.java index 18ab662f3..6d6e7c81c 100644 --- a/src/main/java/org/codelibs/fess/helper/QueryHelper.java +++ b/src/main/java/org/codelibs/fess/helper/QueryHelper.java @@ -77,7 +77,9 @@ import org.lastaflute.web.util.LaRequestUtil; public class QueryHelper { - private static final String ES_SCORE_FIELD = "_score"; + protected static final String PREFERENCE_QUERY = "_query"; + + protected static final String ES_SCORE_FIELD = "_score"; protected static final String SCORE_SORT_VALUE = "score"; @@ -721,7 +723,8 @@ public class QueryHelper { return apiResponseFieldSet.contains(field); } - public void processSearchPreference(final SearchRequestBuilder searchRequestBuilder, final OptionalThing userBean) { + public void processSearchPreference(final SearchRequestBuilder searchRequestBuilder, final OptionalThing userBean, + final String query) { userBean.map(user -> { if (user.hasRoles(ComponentUtil.getFessConfig().getAuthenticationAdminRolesAsArray())) { return Constants.SEARCH_PREFERENCE_LOCAL; @@ -738,25 +741,29 @@ public class QueryHelper { } final Object accessType = r.getAttribute(Constants.SEARCH_LOG_ACCESS_TYPE); if (Constants.SEARCH_LOG_ACCESS_TYPE_JSON.equals(accessType)) { - return processJsonSearchPreference(r); + return processJsonSearchPreference(r, query); } else if (Constants.SEARCH_LOG_ACCESS_TYPE_GSA.equals(accessType)) { - return processGsaSearchPreference(r); + return processGsaSearchPreference(r, query); } return null; }).ifPresent(p -> searchRequestBuilder.setPreference(p))); } - protected String processJsonSearchPreference(final HttpServletRequest req) { + protected String processJsonSearchPreference(final HttpServletRequest req, final String query) { final String pref = ComponentUtil.getFessConfig().getQueryJsonDefaultPreference(); - if (StringUtil.isNotBlank(pref)) { + if (PREFERENCE_QUERY.equals(pref)) { + return Integer.toString(query.hashCode()); + } else if (StringUtil.isNotBlank(pref)) { return pref; } return null; } - protected String processGsaSearchPreference(final HttpServletRequest req) { + protected String processGsaSearchPreference(final HttpServletRequest req, final String query) { final String pref = ComponentUtil.getFessConfig().getQueryGsaDefaultPreference(); - if (StringUtil.isNotBlank(pref)) { + if (PREFERENCE_QUERY.equals(pref)) { + return Integer.toString(query.hashCode()); + } else if (StringUtil.isNotBlank(pref)) { return pref; } return null; diff --git a/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java b/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java index 798aae3f8..018407fa5 100644 --- a/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java +++ b/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java @@ -648,10 +648,10 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction /** The key of the configuration. e.g. */ String QUERY_DEFAULT_LANGUAGES = "query.default.languages"; - /** The key of the configuration. e.g. _local */ + /** The key of the configuration. e.g. _query */ String QUERY_JSON_DEFAULT_PREFERENCE = "query.json.default.preference"; - /** The key of the configuration. e.g. _local */ + /** The key of the configuration. e.g. _query */ String QUERY_GSA_DEFAULT_PREFERENCE = "query.gsa.default.preference"; /** The key of the configuration. e.g. ar=ar @@ -3343,14 +3343,14 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction /** * Get the value for the key 'query.json.default.preference'.
- * The value is, e.g. _local
+ * The value is, e.g. _query
* @return The value of found property. (NotNull: if not found, exception but basically no way) */ String getQueryJsonDefaultPreference(); /** * Get the value for the key 'query.gsa.default.preference'.
- * The value is, e.g. _local
+ * The value is, e.g. _query
* @return The value of found property. (NotNull: if not found, exception but basically no way) */ String getQueryGsaDefaultPreference(); @@ -8310,8 +8310,8 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction defaultMap.put(FessConfig.QUERY_COLLAPSE_INNER_HITS_SIZE, "0"); defaultMap.put(FessConfig.QUERY_COLLAPSE_INNER_HITS_SORTS, ""); defaultMap.put(FessConfig.QUERY_DEFAULT_LANGUAGES, ""); - defaultMap.put(FessConfig.QUERY_JSON_DEFAULT_PREFERENCE, "_local"); - defaultMap.put(FessConfig.QUERY_GSA_DEFAULT_PREFERENCE, "_local"); + defaultMap.put(FessConfig.QUERY_JSON_DEFAULT_PREFERENCE, "_query"); + defaultMap.put(FessConfig.QUERY_GSA_DEFAULT_PREFERENCE, "_query"); defaultMap .put(FessConfig.QUERY_LANGUAGE_MAPPING, "ar=ar\nbg=bg\nbn=bn\nca=ca\nckb-iq=ckb-iq\nckb_IQ=ckb-iq\ncs=cs\nda=da\nde=de\nel=el\nen=en\nen-ie=en-ie\nen_IE=en-ie\nes=es\net=et\neu=eu\nfa=fa\nfi=fi\nfr=fr\ngl=gl\ngu=gu\nhe=he\nhi=hi\nhr=hr\nhu=hu\nhy=hy\nid=id\nit=it\nja=ja\nko=ko\nlt=lt\nlv=lv\nmk=mk\nml=ml\nnl=nl\nno=no\npa=pa\npl=pl\npt=pt\npt-br=pt-br\npt_BR=pt-br\nro=ro\nru=ru\nsi=si\nsq=sq\nsv=sv\nta=ta\nte=te\nth=th\ntl=tl\ntr=tr\nuk=uk\nur=ur\nvi=vi\nzh-cn=zh-cn\nzh_CN=zh-cn\nzh-tw=zh-tw\nzh_TW=zh-tw\nzh=zh\n"); diff --git a/src/main/resources/fess_config.properties b/src/main/resources/fess_config.properties index 20691cbe1..e6ff91ade 100644 --- a/src/main/resources/fess_config.properties +++ b/src/main/resources/fess_config.properties @@ -315,8 +315,8 @@ query.collapse.inner.hits.name=similar_docs query.collapse.inner.hits.size=0 query.collapse.inner.hits.sorts= query.default.languages= -query.json.default.preference=_local -query.gsa.default.preference=_local +query.json.default.preference=_query +query.gsa.default.preference=_query query.language.mapping=\ ar=ar\n\ bg=bg\n\