Authored by hugufei

模糊搜索关键字搜索支持skn和权重配置

... ... @@ -45,7 +45,7 @@ public class CsSearchKeywordConfigService {
SearchParam searchParam = new SearchParam();
searchParam.setOffset(0);
searchParam.setSize(10000);
//2、执行搜索
SearchResult searchResult = searchCommonService.doSearch(ISearchConstants.INDEX_NAME_CS_SEARCH_KEYWORD_CONFIG, searchParam);
... ... @@ -77,6 +77,8 @@ public class CsSearchKeywordConfigService {
csSearchKeywordConfig.setYohoBrandIds(MapUtils.getString(esMap,"yohoBrandIds"));
csSearchKeywordConfig.setUfoBrandIds(MapUtils.getString(esMap,"ufoBrandIds"));
csSearchKeywordConfig.setSortIds(MapUtils.getString(esMap,"sortIds"));
csSearchKeywordConfig.setSkns(MapUtils.getString(esMap,"skns"));
csSearchKeywordConfig.setBoost(MapUtils.getFloat(esMap,"boost"));
return csSearchKeywordConfig;
}
... ...
... ... @@ -7,7 +7,6 @@ import com.yoho.search.models.SortIdInfo;
import com.yoho.search.service.scorer.IScorer;
import com.yoho.search.service.scorer.YohoFilterFunctionBuilders;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
... ... @@ -21,18 +20,23 @@ public class SearchKeyWordScorer implements IScorer {
private List<Integer> ufoBrandIds;
private List<Integer> yohoBrandIds;
private List<SortIdInfo> sortIdInfos;
private List<Integer> sknList;
private Float boost;
public SearchKeyWordScorer(CsSearchKeywordConfig searchKeywordConfig) {
this.productType = searchKeywordConfig.getProductType();
this.ufoBrandIds = ConvertUtils.stringToIntList(searchKeywordConfig.getUfoBrandIds(), ",");
this.yohoBrandIds = ConvertUtils.stringToIntList(searchKeywordConfig.getYohoBrandIds(), ",");
this.sortIdInfos = new ArrayList<>();
if (StringUtils.isBlank(searchKeywordConfig.getSortIds())) {
return;
}
List<String> sortIdInfoStrList = ConvertUtils.stringToStringList(searchKeywordConfig.getSortIds(), ";");
this.sortIdInfos = this.buildSortIdInfoList(searchKeywordConfig.getSortIds());
this.sknList = ConvertUtils.stringToIntList(searchKeywordConfig.getSkns(), ",");
this.boost = searchKeywordConfig.getBoost();
}
private List<SortIdInfo> buildSortIdInfoList(String paramSortIds) {
List<SortIdInfo> tempSortIdInfos = new ArrayList<>();
List<String> sortIdInfoStrList = ConvertUtils.stringToStringList(paramSortIds, ";");
if (CollectionUtils.isEmpty(sortIdInfoStrList)) {
return;
return tempSortIdInfos;
}
for (String sortIdInfoStr : sortIdInfoStrList) {
List<Integer> sortIds = ConvertUtils.stringToIntList(sortIdInfoStr, "-");
... ... @@ -49,19 +53,22 @@ public class SearchKeyWordScorer implements IScorer {
if (sortIds.size() >= 3) {
sortIdInfo.setSmallSortId(sortIds.get(2));
}
sortIdInfos.add(sortIdInfo);
tempSortIdInfos.add(sortIdInfo);
}
return tempSortIdInfos;
}
@Override
public void addScorer(YohoFilterFunctionBuilders yohoFilterFunctionBuilders) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//1、过滤商品类型
if (productType == 1) {
boolQueryBuilder.mustNot(QueryBuilders.termQuery(ProductIndexEsField.isUfo, "Y"));
}else if (productType == 2) {
} else if (productType == 2) {
boolQueryBuilder.must(QueryBuilders.termQuery(ProductIndexEsField.isUfo, "Y"));
}
//2、过滤品牌
if (CollectionUtils.isNotEmpty(ufoBrandIds) || CollectionUtils.isNotEmpty(yohoBrandIds)) {
BoolQueryBuilder brandFilters = QueryBuilders.boolQuery();
... ... @@ -73,6 +80,7 @@ public class SearchKeyWordScorer implements IScorer {
}
boolQueryBuilder.must(brandFilters);
}
//3、过滤品类
if (CollectionUtils.isNotEmpty(sortIdInfos)) {
BoolQueryBuilder sortFilters = QueryBuilders.boolQuery();
... ... @@ -91,6 +99,15 @@ public class SearchKeyWordScorer implements IScorer {
}
boolQueryBuilder.must(sortFilters);
}
yohoFilterFunctionBuilders.add(boolQueryBuilder, ScoreFunctionBuilders.weightFactorFunction(100));
//4、过滤skn
if (CollectionUtils.isNotEmpty(sknList)) {
boolQueryBuilder.must(QueryBuilders.termsQuery(ProductIndexEsField.productSkn, sknList));
}
// 5、打分器
if( boolQueryBuilder.hasClauses()){
yohoFilterFunctionBuilders.add(boolQueryBuilder, ScoreFunctionBuilders.weightFactorFunction(boost==null?100:boost));
}
}
}
... ...