fix #2315 add track_total_hits

This commit is contained in:
Shinsuke Sugaya 2019-11-26 22:16:18 +09:00
parent 59382c4c9a
commit 9a182f4f0b
7 changed files with 65 additions and 18 deletions

View file

@ -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";
}

View file

@ -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");

View file

@ -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");

View file

@ -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<String, String[]> getConditions() {
return as;
}
@Override
public String getTrackTotalHits() {
return track_total_hits;
}
}

View file

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

View file

@ -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 -> {

View file

@ -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()) {