diff --git a/src/main/java/org/codelibs/fess/Constants.java b/src/main/java/org/codelibs/fess/Constants.java index 3f80cd87c..ac0c2e94c 100644 --- a/src/main/java/org/codelibs/fess/Constants.java +++ b/src/main/java/org/codelibs/fess/Constants.java @@ -433,4 +433,6 @@ public class Constants extends CoreLibConstants { public static final String FESS_VAR_PATH = "fess.var.path"; public static final String FESS_LOG_LEVEL = "fess.log.level"; + + public static final String TRACK_TOTAL_HITS = "track_total_hits"; } diff --git a/src/main/java/org/codelibs/fess/api/gsa/GsaApiManager.java b/src/main/java/org/codelibs/fess/api/gsa/GsaApiManager.java index 4f596d29a..054ca67d8 100644 --- a/src/main/java/org/codelibs/fess/api/gsa/GsaApiManager.java +++ b/src/main/java/org/codelibs/fess/api/gsa/GsaApiManager.java @@ -447,6 +447,11 @@ public class GsaApiManager extends BaseApiManager implements WebApiManager { } } + @Override + public String getTrackTotalHits() { + return request.getParameter(Constants.TRACK_TOTAL_HITS); + } + @Override public String getQuery() { return request.getParameter("q"); diff --git a/src/main/java/org/codelibs/fess/api/json/JsonApiManager.java b/src/main/java/org/codelibs/fess/api/json/JsonApiManager.java index f48a1d428..33057bd7c 100644 --- a/src/main/java/org/codelibs/fess/api/json/JsonApiManager.java +++ b/src/main/java/org/codelibs/fess/api/json/JsonApiManager.java @@ -682,6 +682,11 @@ public class JsonApiManager extends BaseJsonApiManager { this.fessConfig = fessConfig; } + @Override + public String getTrackTotalHits() { + return request.getParameter(Constants.TRACK_TOTAL_HITS); + } + @Override public String getQuery() { return request.getParameter("q"); diff --git a/src/main/java/org/codelibs/fess/app/web/base/SearchForm.java b/src/main/java/org/codelibs/fess/app/web/base/SearchForm.java index 9b95c5eb3..b6bdb5b25 100644 --- a/src/main/java/org/codelibs/fess/app/web/base/SearchForm.java +++ b/src/main/java/org/codelibs/fess/app/web/base/SearchForm.java @@ -61,6 +61,9 @@ public class SearchForm extends SearchRequestParams { @Size(max = 1000) public String sdh; + @Size(max = 100) + public String track_total_hits; + // advance @Override @@ -157,4 +160,10 @@ public class SearchForm extends SearchRequestParams { public Map getConditions() { return as; } + + @Override + public String getTrackTotalHits() { + return track_total_hits; + } + } diff --git a/src/main/java/org/codelibs/fess/entity/SearchRequestParams.java b/src/main/java/org/codelibs/fess/entity/SearchRequestParams.java index ecb1b2c72..5465dc01b 100644 --- a/src/main/java/org/codelibs/fess/entity/SearchRequestParams.java +++ b/src/main/java/org/codelibs/fess/entity/SearchRequestParams.java @@ -72,6 +72,10 @@ public abstract class SearchRequestParams { public abstract String getSimilarDocHash(); + public String getTrackTotalHits() { + return null; + } + public boolean hasConditionQuery() { final Map conditions = getConditions(); return !isEmptyArray(conditions.get(AS_Q))// 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 bbedc0385..bb089a058 100644 --- a/src/main/java/org/codelibs/fess/es/client/FessEsClient.java +++ b/src/main/java/org/codelibs/fess/es/client/FessEsClient.java @@ -1007,17 +1007,18 @@ public class FessEsClient implements Client { } public static class SearchConditionBuilder { - private final SearchRequestBuilder searchRequestBuilder; - private String query; - private String[] responseFields; - private int offset = Constants.DEFAULT_START_COUNT; - private int size = Constants.DEFAULT_PAGE_SIZE; - private GeoInfo geoInfo; - private FacetInfo facetInfo; - private HighlightInfo highlightInfo; - private String similarDocHash; - private SearchRequestType searchRequestType = SearchRequestType.SEARCH; - private boolean isScroll = false; + protected final SearchRequestBuilder searchRequestBuilder; + protected String query; + protected String[] responseFields; + protected int offset = Constants.DEFAULT_START_COUNT; + protected int size = Constants.DEFAULT_PAGE_SIZE; + protected GeoInfo geoInfo; + protected FacetInfo facetInfo; + protected HighlightInfo highlightInfo; + protected String similarDocHash; + protected SearchRequestType searchRequestType = SearchRequestType.SEARCH; + protected boolean isScroll = false; + protected String trackTotalHits = null; public static SearchConditionBuilder builder(final SearchRequestBuilder searchRequestBuilder) { return new SearchConditionBuilder(searchRequestBuilder); @@ -1092,6 +1093,11 @@ public class FessEsClient implements Client { return this; } + public SearchConditionBuilder trackTotalHits(final String trackTotalHits) { + this.trackTotalHits = trackTotalHits; + return this; + } + public boolean build() { if (StringUtil.isBlank(query)) { return false; @@ -1108,12 +1114,7 @@ public class FessEsClient implements Client { searchRequestBuilder.setFrom(offset).setSize(size); - final Object trackTotalHitsValue = fessConfig.getQueryTrackTotalHitsValue(); - if (trackTotalHitsValue instanceof Boolean) { - searchRequestBuilder.setTrackTotalHits((Boolean) trackTotalHitsValue); - } else if (trackTotalHitsValue instanceof Number) { - searchRequestBuilder.setTrackTotalHitsUpTo(((Number) trackTotalHitsValue).intValue()); - } + buildTrackTotalHits(fessConfig); if (responseFields != null) { searchRequestBuilder.setFetchSource(responseFields, null); @@ -1144,6 +1145,27 @@ public class FessEsClient implements Client { return true; } + protected void buildTrackTotalHits(final FessConfig fessConfig) { + if (StringUtil.isNotBlank(trackTotalHits)) { + try { + searchRequestBuilder.setTrackTotalHitsUpTo(Integer.valueOf(trackTotalHits)); + return; + } catch (final NumberFormatException e) { + // ignore + } + if (Constants.TRUE.equalsIgnoreCase(trackTotalHits) || Constants.FALSE.equalsIgnoreCase(trackTotalHits)) { + searchRequestBuilder.setTrackTotalHits(Boolean.valueOf(trackTotalHits)); + return; + } + } + final Object trackTotalHitsValue = fessConfig.getQueryTrackTotalHitsValue(); + if (trackTotalHitsValue instanceof Boolean) { + searchRequestBuilder.setTrackTotalHits((Boolean) trackTotalHitsValue); + } else if (trackTotalHitsValue instanceof Number) { + searchRequestBuilder.setTrackTotalHitsUpTo(((Number) trackTotalHitsValue).intValue()); + } + } + protected void buildFacet(final QueryHelper queryHelper, final FessConfig fessConfig) { stream(facetInfo.field).of( stream -> stream.forEach(f -> { diff --git a/src/main/java/org/codelibs/fess/helper/SearchHelper.java b/src/main/java/org/codelibs/fess/helper/SearchHelper.java index 16367149d..09ca96af3 100644 --- a/src/main/java/org/codelibs/fess/helper/SearchHelper.java +++ b/src/main/java/org/codelibs/fess/helper/SearchHelper.java @@ -99,7 +99,7 @@ public class SearchHelper { return SearchConditionBuilder.builder(searchRequestBuilder).query(query).offset(pageStart).size(pageSize) .facetInfo(params.getFacetInfo()).geoInfo(params.getGeoInfo()).highlightInfo(params.getHighlightInfo()) .similarDocHash(params.getSimilarDocHash()).responseFields(queryHelper.getResponseFields()) - .searchRequestType(params.getType()).build(); + .searchRequestType(params.getType()).trackTotalHits(params.getTrackTotalHits()).build(); }, (searchRequestBuilder, execTime, searchResponse) -> { searchResponse.ifPresent(r -> { if (r.getTotalShards() != r.getSuccessfulShards() && fessConfig.isQueryTimeoutLogging()) {