Authored by hugufei

添加filterQuery,过滤商品名称,只过滤,不打分

... ... @@ -32,7 +32,7 @@ public class BaseSceneService {
String keyword = SearchKeyWordUtils.getParamKeyword(paramMap, SearchRequestParams.PARAM_SEARCH_QUERY);// 转码
if (!StringUtils.isBlank(keyword)) {
paramMap.put(SearchRequestParams.PARAM_SEARCH_QUERY, keyword);
paramMap.put("is_encode", "0");
paramMap.put(SearchRequestParams.PARAM_SEARCH_IS_ENCODE, "0");
}
}
... ...
... ... @@ -9,6 +9,10 @@ public class SearchRequestParams {
public static final String PARAM_SEARCH_VIEWNUM = "viewNum"; // 数量
public static final String PARAM_SEARCH_QUERY = "query";// 检索关键词
public static final String PARAM_SEARCH_FILTER_QUERY = "filterQuery";// 过滤关键词,不打分
public static final String PARAM_SEARCH_IS_ENCODE = "is_encode";// 检索关键词
public static final String PARAM_SEARCH_SHOPS_KEYWORD = "keyword";// 店铺检索词
public static final String PARAM_SEARCH_GENDER = "gender"; // 性别ids[1,2,3]
... ...
package com.yoho.search.common.utils;
import com.yoho.search.common.SearchRequestParams;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ... @@ -35,6 +36,21 @@ public class SearchKeyWordUtils {
return keyword;
}
public static String getFilterQueryWord(Map<String, String> paramMap) {
String keyword = paramMap.get(SearchRequestParams.PARAM_SEARCH_FILTER_QUERY);
if (StringUtils.isBlank(keyword)) {
return null;
}
// 强制编码转换
try {
keyword = URLDecoder.decode(keyword, StandardCharsets.UTF_8.name());
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
keyword = keyword.toLowerCase();
return keyword;
}
public static String getUfoParamKeyword(Map<String, String> paramMap, String keywordParam) {
String keyword = paramMap.get(keywordParam);
if (StringUtils.isBlank(keyword)) {
... ...
... ... @@ -176,7 +176,7 @@ public class RecallResultController {
String keyword = SearchKeyWordUtils.getParamKeyword(paramMap, SearchRequestParams.PARAM_SEARCH_QUERY);// 转码
if (!StringUtils.isBlank(keyword)) {
paramMap.put(SearchRequestParams.PARAM_SEARCH_QUERY, keyword);
paramMap.put("is_encode", "0");
paramMap.put(SearchRequestParams.PARAM_SEARCH_IS_ENCODE, "0");
}
}
... ...
package com.yoho.search.restapi.tools;
import com.yoho.search.base.utils.ProductIndexEsField;
import com.yoho.search.core.es.model.SearchField;
import com.yoho.search.core.es.model.SearchParam;
import com.yoho.search.core.es.utils.SearchParamUtils;
import org.elasticsearch.common.lucene.search.function.FiltersFunctionScoreQuery;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
... ... @@ -17,25 +15,13 @@ public class SearchParamsTest {
public static void main(String[] args) {
SearchParam searchParam = new SearchParam();
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("air ma");
multiMatchQueryBuilder.field("productName_ik", 1000);
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("刺绣卫衣");
multiMatchQueryBuilder.field(ProductIndexEsField.smallSort, 1000);
multiMatchQueryBuilder.field(ProductIndexEsField.productName_productName_ansj, 300);
multiMatchQueryBuilder.minimumShouldMatch("100%");
queryBuilder.should(multiMatchQueryBuilder);
searchParam.setQuery(multiMatchQueryBuilder);
BoolQueryBuilder wildcardQuery = new BoolQueryBuilder();
wildcardQuery.must(QueryBuilders.wildcardQuery("productName.productName_ik", "*air*"));
wildcardQuery.must(QueryBuilders.wildcardQuery("productName.productName_ik", "*ma*"));
queryBuilder.should(wildcardQuery);
FunctionScoreQueryBuilder.FilterFunctionBuilder[] filters = new FunctionScoreQueryBuilder.FilterFunctionBuilder[2];
filters[0] = new FunctionScoreQueryBuilder.FilterFunctionBuilder(multiMatchQueryBuilder, ScoreFunctionBuilders.weightFactorFunction(100));
filters[1] = new FunctionScoreQueryBuilder.FilterFunctionBuilder(multiMatchQueryBuilder, ScoreFunctionBuilders.weightFactorFunction(1));
FunctionScoreQueryBuilder functionScoreQueryBuilder = new FunctionScoreQueryBuilder(queryBuilder, filters);
functionScoreQueryBuilder.scoreMode(FiltersFunctionScoreQuery.ScoreMode.MAX);
searchParam.setQuery(functionScoreQueryBuilder);
searchParam.setSize(100);
searchParam.setSortBuilders(Arrays.asList(SortBuilders.scoreSort().order(SortOrder.DESC)));
System.out.println(SearchParamUtils.genSearchSourceBuilderFromSearchParam(searchParam));
... ...
... ... @@ -394,6 +394,20 @@ public class SearchQueryHelper {
boolFilter.must(marketPromotionFilter);
}
//关键词过滤-只过滤不打分
String filterQuery = SearchKeyWordUtils.getFilterQueryWord(paramMap);
if (StringUtils.isNotBlank(filterQuery)) {
MultiMatchQueryBuilder filterQueryBuilder = QueryBuilders.multiMatchQuery(filterQuery);
List<SearchField> searchFields = SearchFieldUtils.getFilterQueryFields();
for (SearchField searchField : searchFields) {
filterQueryBuilder.field(searchField.getEsField(), searchField.getBoost());
}
filterQueryBuilder.minimumShouldMatch("100%");
filterQueryBuilder.type(MultiMatchQueryBuilder.Type.CROSS_FIELDS);
filterQueryBuilder.operator(Operator.OR);
boolFilter.must(filterQueryBuilder);
}
if (boolFilter.hasClauses()) {
return boolFilter;
} else {
... ...