Kaynağa Gözat

fix #2315 add track_total_hits

Shinsuke Sugaya 5 yıl önce
ebeveyn
işleme
9a182f4f0b

+ 2 - 0
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_VAR_PATH = "fess.var.path";
 
 
     public static final String FESS_LOG_LEVEL = "fess.log.level";
     public static final String FESS_LOG_LEVEL = "fess.log.level";
+
+    public static final String TRACK_TOTAL_HITS = "track_total_hits";
 }
 }

+ 5 - 0
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
         @Override
         public String getQuery() {
         public String getQuery() {
             return request.getParameter("q");
             return request.getParameter("q");

+ 5 - 0
src/main/java/org/codelibs/fess/api/json/JsonApiManager.java

@@ -682,6 +682,11 @@ public class JsonApiManager extends BaseJsonApiManager {
             this.fessConfig = fessConfig;
             this.fessConfig = fessConfig;
         }
         }
 
 
+        @Override
+        public String getTrackTotalHits() {
+            return request.getParameter(Constants.TRACK_TOTAL_HITS);
+        }
+
         @Override
         @Override
         public String getQuery() {
         public String getQuery() {
             return request.getParameter("q");
             return request.getParameter("q");

+ 9 - 0
src/main/java/org/codelibs/fess/app/web/base/SearchForm.java

@@ -61,6 +61,9 @@ public class SearchForm extends SearchRequestParams {
     @Size(max = 1000)
     @Size(max = 1000)
     public String sdh;
     public String sdh;
 
 
+    @Size(max = 100)
+    public String track_total_hits;
+
     // advance
     // advance
 
 
     @Override
     @Override
@@ -157,4 +160,10 @@ public class SearchForm extends SearchRequestParams {
     public Map<String, String[]> getConditions() {
     public Map<String, String[]> getConditions() {
         return as;
         return as;
     }
     }
+
+    @Override
+    public String getTrackTotalHits() {
+        return track_total_hits;
+    }
+
 }
 }

+ 4 - 0
src/main/java/org/codelibs/fess/entity/SearchRequestParams.java

@@ -72,6 +72,10 @@ public abstract class SearchRequestParams {
 
 
     public abstract String getSimilarDocHash();
     public abstract String getSimilarDocHash();
 
 
+    public String getTrackTotalHits() {
+        return null;
+    }
+
     public boolean hasConditionQuery() {
     public boolean hasConditionQuery() {
         final Map<String, String[]> conditions = getConditions();
         final Map<String, String[]> conditions = getConditions();
         return !isEmptyArray(conditions.get(AS_Q))//
         return !isEmptyArray(conditions.get(AS_Q))//

+ 39 - 17
src/main/java/org/codelibs/fess/es/client/FessEsClient.java

@@ -1007,17 +1007,18 @@ public class FessEsClient implements Client {
     }
     }
 
 
     public static class SearchConditionBuilder {
     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) {
         public static SearchConditionBuilder builder(final SearchRequestBuilder searchRequestBuilder) {
             return new SearchConditionBuilder(searchRequestBuilder);
             return new SearchConditionBuilder(searchRequestBuilder);
@@ -1092,6 +1093,11 @@ public class FessEsClient implements Client {
             return this;
             return this;
         }
         }
 
 
+        public SearchConditionBuilder trackTotalHits(final String trackTotalHits) {
+            this.trackTotalHits = trackTotalHits;
+            return this;
+        }
+
         public boolean build() {
         public boolean build() {
             if (StringUtil.isBlank(query)) {
             if (StringUtil.isBlank(query)) {
                 return false;
                 return false;
@@ -1108,12 +1114,7 @@ public class FessEsClient implements Client {
 
 
             searchRequestBuilder.setFrom(offset).setSize(size);
             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) {
             if (responseFields != null) {
                 searchRequestBuilder.setFetchSource(responseFields, null);
                 searchRequestBuilder.setFetchSource(responseFields, null);
@@ -1144,6 +1145,27 @@ public class FessEsClient implements Client {
             return true;
             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) {
         protected void buildFacet(final QueryHelper queryHelper, final FessConfig fessConfig) {
             stream(facetInfo.field).of(
             stream(facetInfo.field).of(
                     stream -> stream.forEach(f -> {
                     stream -> stream.forEach(f -> {

+ 1 - 1
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)
                             return SearchConditionBuilder.builder(searchRequestBuilder).query(query).offset(pageStart).size(pageSize)
                                     .facetInfo(params.getFacetInfo()).geoInfo(params.getGeoInfo()).highlightInfo(params.getHighlightInfo())
                                     .facetInfo(params.getFacetInfo()).geoInfo(params.getGeoInfo()).highlightInfo(params.getHighlightInfo())
                                     .similarDocHash(params.getSimilarDocHash()).responseFields(queryHelper.getResponseFields())
                                     .similarDocHash(params.getSimilarDocHash()).responseFields(queryHelper.getResponseFields())
-                                    .searchRequestType(params.getType()).build();
+                                    .searchRequestType(params.getType()).trackTotalHits(params.getTrackTotalHits()).build();
                         }, (searchRequestBuilder, execTime, searchResponse) -> {
                         }, (searchRequestBuilder, execTime, searchResponse) -> {
                             searchResponse.ifPresent(r -> {
                             searchResponse.ifPresent(r -> {
                                 if (r.getTotalShards() != r.getSuccessfulShards() && fessConfig.isQueryTimeoutLogging()) {
                                 if (r.getTotalShards() != r.getSuccessfulShards() && fessConfig.isQueryTimeoutLogging()) {