fix #2527 multiple keymatch

This commit is contained in:
Shinsuke Sugaya 2021-02-08 22:15:39 +09:00
parent 2c9fe7492b
commit 22260a7c80
2 changed files with 34 additions and 20 deletions

View file

@ -173,7 +173,7 @@ public class AdminKeymatchAction extends FessAdminAction {
copyOp.excludeNull();
});
form.crudMode = crudMode;
docList.addAll(keyMatchHelper.getBoostedDocumentList(entity.getTerm(), entity.getMaxSize()));
docList.addAll(keyMatchHelper.getBoostedDocumentList(entity.getId(), entity.getTerm(), entity.getMaxSize()));
}).orElse(() -> {
throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), this::asListHtml);
});

View file

@ -15,6 +15,7 @@
*/
package org.codelibs.fess.helper;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@ -28,7 +29,7 @@ import org.apache.logging.log4j.Logger;
import org.codelibs.core.concurrent.CommonPoolUtil;
import org.codelibs.core.lang.StringUtil;
import org.codelibs.core.lang.ThreadUtil;
import org.codelibs.core.misc.Pair;
import org.codelibs.core.misc.Tuple3;
import org.codelibs.fesen.index.query.BoolQueryBuilder;
import org.codelibs.fesen.index.query.QueryBuilder;
import org.codelibs.fesen.index.query.QueryBuilders;
@ -48,7 +49,8 @@ import org.codelibs.fess.util.DocumentUtil;
public class KeyMatchHelper {
private static final Logger logger = LogManager.getLogger(KeyMatchHelper.class);
protected volatile Map<String, Map<String, Pair<QueryBuilder, ScoreFunctionBuilder<?>>>> keyMatchQueryMap = Collections.emptyMap();
protected volatile Map<String, Map<String, List<Tuple3<String, QueryBuilder, ScoreFunctionBuilder<?>>>>> keyMatchQueryMap =
Collections.emptyMap();
protected long reloadInterval = 1000L;
@ -73,7 +75,7 @@ public class KeyMatchHelper {
protected void reload(final long interval) {
final FessConfig fessConfig = ComponentUtil.getFessConfig();
final Map<String, Map<String, Pair<QueryBuilder, ScoreFunctionBuilder<?>>>> keyMatchQueryMap = new HashMap<>();
final Map<String, Map<String, List<Tuple3<String, QueryBuilder, ScoreFunctionBuilder<?>>>>> keyMatchQueryMap = new HashMap<>();
getAvailableKeyMatchList().stream().forEach(keyMatch -> {
try {
final BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
@ -97,13 +99,19 @@ public class KeyMatchHelper {
if (StringUtil.isBlank(virtualHost)) {
virtualHost = StringUtil.EMPTY;
}
Map<String, Pair<QueryBuilder, ScoreFunctionBuilder<?>>> queryMap = keyMatchQueryMap.get(virtualHost);
Map<String, List<Tuple3<String, QueryBuilder, ScoreFunctionBuilder<?>>>> queryMap = keyMatchQueryMap.get(virtualHost);
if (queryMap == null) {
queryMap = new HashMap<>();
keyMatchQueryMap.put(virtualHost, queryMap);
}
queryMap.put(toLowerCase(keyMatch.getTerm()),
new Pair<>(boolQuery, ScoreFunctionBuilders.weightFactorFunction(keyMatch.getBoost())));
final String termKey = toLowerCase(keyMatch.getTerm());
List<Tuple3<String, QueryBuilder, ScoreFunctionBuilder<?>>> boostList = queryMap.get(termKey);
if (boostList == null) {
boostList = new ArrayList<>();
queryMap.put(termKey, boostList);
}
boostList.add(
new Tuple3<>(keyMatch.getId(), boolQuery, ScoreFunctionBuilders.weightFactorFunction(keyMatch.getBoost())));
} else if (logger.isDebugEnabled()) {
logger.debug("No KeyMatch boost docs");
}
@ -136,9 +144,9 @@ public class KeyMatchHelper {
this.reloadInterval = reloadInterval;
}
protected Map<String, Pair<QueryBuilder, ScoreFunctionBuilder<?>>> getQueryMap() {
protected Map<String, List<Tuple3<String, QueryBuilder, ScoreFunctionBuilder<?>>>> getQueryMap() {
final String key = ComponentUtil.getVirtualHostHelper().getVirtualHostKey();
final Map<String, Pair<QueryBuilder, ScoreFunctionBuilder<?>>> map = keyMatchQueryMap.get(key);
final Map<String, List<Tuple3<String, QueryBuilder, ScoreFunctionBuilder<?>>>> map = keyMatchQueryMap.get(key);
if (map != null) {
return map;
}
@ -147,24 +155,30 @@ public class KeyMatchHelper {
public void buildQuery(final List<String> keywordList, final List<FilterFunctionBuilder> list) {
keywordList.stream().forEach(keyword -> {
final Pair<QueryBuilder, ScoreFunctionBuilder<?>> pair = getQueryMap().get(toLowerCase(keyword));
if (pair != null) {
list.add(new FilterFunctionBuilder(pair.getFirst(), pair.getSecond()));
final List<Tuple3<String, QueryBuilder, ScoreFunctionBuilder<?>>> boostList = getQueryMap().get(toLowerCase(keyword));
if (boostList != null) {
boostList.forEach(pair -> list.add(new FilterFunctionBuilder(pair.getValue2(), pair.getValue3())));
}
});
}
public List<Map<String, Object>> getBoostedDocumentList(final String term, final int size) {
public List<Map<String, Object>> getBoostedDocumentList(final String id, final String term, final int size) {
final SearchEngineClient searchEngineClient = ComponentUtil.getSearchEngineClient();
final Pair<QueryBuilder, ScoreFunctionBuilder<?>> pair = getQueryMap().get(toLowerCase(term));
if (pair == null) {
final List<Tuple3<String, QueryBuilder, ScoreFunctionBuilder<?>>> boostList = getQueryMap().get(toLowerCase(term));
if (boostList == null) {
return Collections.emptyList();
}
final FessConfig fessConfig = ComponentUtil.getFessConfig();
return searchEngineClient.getDocumentList(fessConfig.getIndexDocumentSearchIndex(), searchRequestBuilder -> {
searchRequestBuilder.setPreference(Constants.SEARCH_PREFERENCE_LOCAL).setQuery(pair.getFirst()).setSize(size);
return true;
});
for (Tuple3<String, QueryBuilder, ScoreFunctionBuilder<?>> pair : boostList) {
if (!id.equals(pair.getValue1())) {
continue;
}
final FessConfig fessConfig = ComponentUtil.getFessConfig();
return searchEngineClient.getDocumentList(fessConfig.getIndexDocumentSearchIndex(), searchRequestBuilder -> {
searchRequestBuilder.setPreference(Constants.SEARCH_PREFERENCE_LOCAL).setQuery(pair.getValue2()).setSize(size);
return true;
});
}
return Collections.emptyList();
}
private String toLowerCase(final String term) {