fix #2527 multiple keymatch
This commit is contained in:
parent
2c9fe7492b
commit
22260a7c80
2 changed files with 34 additions and 20 deletions
|
@ -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);
|
||||
});
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue