fix #2754 add minScore

This commit is contained in:
Shinsuke Sugaya 2023-07-08 15:45:12 +09:00
parent e123dea93c
commit fc0a5cd699
3 changed files with 44 additions and 19 deletions

View file

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

View file

@ -1228,6 +1228,7 @@ public class SearchEngineClient implements Client {
protected SearchRequestType searchRequestType = SearchRequestType.SEARCH;
protected boolean isScroll = false;
protected String trackTotalHits = null;
protected Float minScore = null;
public static SearchConditionBuilder builder(final SearchRequestBuilder searchRequestBuilder) {
return new SearchConditionBuilder(searchRequestBuilder);
@ -1307,6 +1308,11 @@ public class SearchEngineClient implements Client {
return this;
}
public SearchConditionBuilder minScore(final Float minScore) {
this.minScore = minScore;
return this;
}
public boolean build() {
if (StringUtil.isBlank(query)) {
return false;
@ -1325,6 +1331,7 @@ public class SearchEngineClient implements Client {
searchRequestBuilder.setFrom(offset).setSize(size);
buildTrackTotalHits(fessConfig);
buildMinScore(fessConfig);
if (responseFields != null) {
searchRequestBuilder.setFetchSource(responseFields, null);
@ -1355,6 +1362,12 @@ public class SearchEngineClient implements Client {
return true;
}
protected void buildMinScore(final FessConfig fessConfig) {
if (minScore != null) {
searchRequestBuilder.setMinScore(minScore);
}
}
protected void buildTrackTotalHits(final FessConfig fessConfig) {
if (isScroll) {
return;

View file

@ -23,6 +23,7 @@ import org.apache.logging.log4j.Logger;
import org.codelibs.core.stream.StreamUtil;
import org.codelibs.fess.Constants;
import org.codelibs.fess.entity.SearchRequestParams;
import org.codelibs.fess.es.client.SearchEngineClient.SearchCondition;
import org.codelibs.fess.es.client.SearchEngineClient.SearchConditionBuilder;
import org.codelibs.fess.helper.ViewHelper;
import org.codelibs.fess.mylasta.action.FessUserBean;
@ -33,6 +34,7 @@ import org.codelibs.fess.util.FacetResponse;
import org.dbflute.optional.OptionalEntity;
import org.dbflute.optional.OptionalThing;
import org.lastaflute.web.util.LaRequestUtil;
import org.opensearch.action.search.SearchRequestBuilder;
import org.opensearch.action.search.SearchResponse;
import org.opensearch.common.document.DocumentField;
import org.opensearch.search.SearchHit;
@ -107,26 +109,32 @@ public class DefaultSearcher extends RankFusionSearcher {
protected OptionalEntity<SearchResponse> sendRequest(final String query, final SearchRequestParams params,
final OptionalThing<FessUserBean> userBean) {
final FessConfig fessConfig = ComponentUtil.getFessConfig();
final int pageSize = params.getPageSize();
return ComponentUtil.getSearchEngineClient().search(fessConfig.getIndexDocumentSearchIndex(), searchRequestBuilder -> {
return ComponentUtil.getSearchEngineClient().search(fessConfig.getIndexDocumentSearchIndex(),
createSearchCondition(query, params, userBean), (searchRequestBuilder, execTime, searchResponse) -> {
searchResponse.ifPresent(r -> {
if (r.getTotalShards() != r.getSuccessfulShards() && fessConfig.isQueryTimeoutLogging()) {
// partial results
final StringBuilder buf = new StringBuilder(1000);
buf.append("[SEARCH TIMEOUT] {\"exec_time\":").append(execTime)//
.append(",\"request\":").append(searchRequestBuilder.toString())//
.append(",\"response\":").append(r.toString()).append('}');
logger.warn(buf.toString());
}
});
return searchResponse;
});
}
protected SearchCondition<SearchRequestBuilder> createSearchCondition(final String query, final SearchRequestParams params,
final OptionalThing<FessUserBean> userBean) {
return searchRequestBuilder -> {
ComponentUtil.getQueryHelper().processSearchPreference(searchRequestBuilder, userBean, query);
return SearchConditionBuilder.builder(searchRequestBuilder).query(query).offset(params.getStartPosition()).size(pageSize)
.facetInfo(params.getFacetInfo()).geoInfo(params.getGeoInfo()).highlightInfo(params.getHighlightInfo())
.similarDocHash(params.getSimilarDocHash()).responseFields(params.getResponseFields())
.searchRequestType(params.getType()).trackTotalHits(params.getTrackTotalHits()).build();
}, (searchRequestBuilder, execTime, searchResponse) -> {
searchResponse.ifPresent(r -> {
if (r.getTotalShards() != r.getSuccessfulShards() && fessConfig.isQueryTimeoutLogging()) {
// partial results
final StringBuilder buf = new StringBuilder(1000);
buf.append("[SEARCH TIMEOUT] {\"exec_time\":").append(execTime)//
.append(",\"request\":").append(searchRequestBuilder.toString())//
.append(",\"response\":").append(r.toString()).append('}');
logger.warn(buf.toString());
}
});
return searchResponse;
});
return SearchConditionBuilder.builder(searchRequestBuilder).query(query).offset(params.getStartPosition())
.size(params.getPageSize()).facetInfo(params.getFacetInfo()).geoInfo(params.getGeoInfo())
.highlightInfo(params.getHighlightInfo()).similarDocHash(params.getSimilarDocHash())
.responseFields(params.getResponseFields()).searchRequestType(params.getType())
.trackTotalHits(params.getTrackTotalHits()).minScore(params.getMinScore()).build();
};
}
protected Map<String, Object> parseSearchHit(final FessConfig fessConfig, final String hlPrefix, final SearchHit searchHit) {