|
|
@@ -10,10 +10,7 @@ import com.uas.search.constant.model.SPage;
|
|
|
import com.uas.search.exception.SearchException;
|
|
|
import com.uas.search.grouping.DistinctGroupCollector;
|
|
|
import com.uas.search.grouping.GoodsGroupCollector;
|
|
|
-import com.uas.search.model.Brand;
|
|
|
-import com.uas.search.model.Component;
|
|
|
-import com.uas.search.model.Goods;
|
|
|
-import com.uas.search.model.Kind;
|
|
|
+import com.uas.search.model.*;
|
|
|
import com.uas.search.service.SearchService;
|
|
|
import com.uas.search.sort.SimilarValuesFieldComparatorSource;
|
|
|
import com.uas.search.sort.StringFieldComparatorSource;
|
|
|
@@ -168,7 +165,8 @@ public class SearchServiceImpl implements SearchService {
|
|
|
* @return 品牌排序规则
|
|
|
*/
|
|
|
private SortField[] sortBrand(String keyword) {
|
|
|
- // 分数 > 自定义排序 > 权重 > 访问量 > 搜索次数
|
|
|
+ // 自定义排序 > 权重 > 访问量 > 搜索次数 > 分数
|
|
|
+ // 分数排序放在最后,是因为有的中英文名称相同,分数翻倍,但实际匹配度并不高
|
|
|
return new SortField[]{
|
|
|
new SortField(SearchConstants.BRAND_NAMEEN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword)),
|
|
|
new SortField(SearchConstants.BRAND_NAMECN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword)),
|
|
|
@@ -1057,9 +1055,10 @@ public class SearchServiceImpl implements SearchService {
|
|
|
* @return 批次排序规则
|
|
|
*/
|
|
|
private SortField[] sortGoods(String keyword) {
|
|
|
- // 批次(访问量) > 器件(自定义排序 > 访问量 > 搜索次数) > 品牌(自定义排序 > 权重 > 访问量 > 搜索次数) > 类目(访问量 > 搜索次数)
|
|
|
+ // 器件、非标型号自定义排序 > 批次(访问量) > 器件(自定义排序 > 访问量 > 搜索次数) > 品牌(自定义排序 > 权重 > 访问量 > 搜索次数) > 类目(访问量 > 搜索次数)
|
|
|
return new SortField[]{
|
|
|
new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword)),
|
|
|
+ new SortField(SearchConstants.GOODS_PR_PCMPCODE_FIELD, new StringFieldComparatorSource(keyword)),
|
|
|
sortField(SearchConstants.GOODS_GO_VISIT_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
|
|
|
sortField(SearchConstants.GOODS_CMP_VISIT_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
|
|
|
sortField(SearchConstants.GOODS_CMP_SEARCH_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
|
|
|
@@ -1206,45 +1205,40 @@ public class SearchServiceImpl implements SearchService {
|
|
|
booleanQuery.add(booleanQuery2, BooleanClause.Occur.MUST);
|
|
|
}
|
|
|
}
|
|
|
+ // 过滤状态
|
|
|
+ filter(Arrays.asList(TradeGoods.VALID_STATUS), SearchConstants.GOODS_GO_STATUS_FIELD, booleanQuery);
|
|
|
return booleanQuery;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 同时搜索器件、类目、品牌,并设置boost
|
|
|
- *
|
|
|
- * @param keyword
|
|
|
- * @return
|
|
|
+ * 同时搜索器件、类目、品牌等,并设置boost
|
|
|
*/
|
|
|
private Query setGoodsBoost(String keyword) {
|
|
|
BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
- BooleanQuery componentCodeQuery = createQuery(SearchConstants.GOODS_CMP_CODE_FIELD, keyword, true);
|
|
|
- componentCodeQuery.setBoost(100);
|
|
|
- booleanQuery.add(componentCodeQuery, BooleanClause.Occur.SHOULD);
|
|
|
- BooleanQuery brandNameCnQuery = createQuery(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, keyword, true);
|
|
|
- brandNameCnQuery.setBoost(10);
|
|
|
- booleanQuery.add(brandNameCnQuery, BooleanClause.Occur.SHOULD);
|
|
|
- BooleanQuery brandNameEnQuery = createQuery(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, keyword, true);
|
|
|
- brandNameEnQuery.setBoost(10);
|
|
|
- booleanQuery.add(brandNameEnQuery, BooleanClause.Occur.SHOULD);
|
|
|
- BooleanQuery kindNameQuery = createQuery(SearchConstants.GOODS_KI_NAME_CN_FIELD, keyword);
|
|
|
- kindNameQuery.setBoost(1);
|
|
|
- booleanQuery.add(kindNameQuery, BooleanClause.Occur.SHOULD);
|
|
|
- BooleanQuery descriptionQuery = createQuery(SearchConstants.GOODS_CMP_DESCRIPTION_FIELD, keyword);
|
|
|
- descriptionQuery.setBoost(1);
|
|
|
- booleanQuery.add(descriptionQuery, BooleanClause.Occur.SHOULD);
|
|
|
+ // 原厂型号
|
|
|
+ booleanQuery.add(createQuery(SearchConstants.GOODS_CMP_CODE_FIELD, keyword, true, 100), BooleanClause.Occur.SHOULD);
|
|
|
+ // 非标
|
|
|
+ booleanQuery.add(createQuery(SearchConstants.GOODS_PR_PCMPCODE_FIELD, keyword, true, 100), Occur.SHOULD);
|
|
|
+ // 品牌
|
|
|
+ booleanQuery.add(createQuery(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, keyword, true, 10), BooleanClause.Occur.SHOULD);
|
|
|
+ booleanQuery.add(createQuery(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, keyword, true, 10), BooleanClause.Occur.SHOULD);
|
|
|
+ // 类目
|
|
|
+ booleanQuery.add(createQuery(SearchConstants.GOODS_KI_NAME_CN_FIELD, keyword, 1), BooleanClause.Occur.SHOULD);
|
|
|
+ // 属性值
|
|
|
+ booleanQuery.add(createQuery(SearchConstants.GOODS_CMP_DESCRIPTION_FIELD, keyword, 1), BooleanClause.Occur.SHOULD);
|
|
|
return booleanQuery;
|
|
|
}
|
|
|
|
|
|
- private BooleanQuery createQuery(String field, String keyword){
|
|
|
- return createQuery(field, keyword, false);
|
|
|
+ private BooleanQuery createQuery(String field, String keyword, float boost){
|
|
|
+ return createQuery(field, keyword, false, boost);
|
|
|
}
|
|
|
|
|
|
|
|
|
- private BooleanQuery createQuery(String field, String keyword, boolean useRegexpQuery){
|
|
|
+ private BooleanQuery createQuery(String field, String keyword, boolean useRegexpQuery, float boost){
|
|
|
+ BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
if (StringUtils.isEmpty(field) || StringUtils.isEmpty(keyword)) {
|
|
|
- return null;
|
|
|
+ return booleanQuery;
|
|
|
}
|
|
|
- BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
// 根据空格分隔关键词,分隔的词取或的关系
|
|
|
String[] array = keyword.split(" ");
|
|
|
for(String str : array){
|
|
|
@@ -1252,6 +1246,7 @@ public class SearchServiceImpl implements SearchService {
|
|
|
booleanQuery.add(SearchUtils.getBooleanQuery(field, str, useRegexpQuery), Occur.SHOULD);
|
|
|
}
|
|
|
}
|
|
|
+ booleanQuery.setBoost(boost);
|
|
|
return booleanQuery;
|
|
|
}
|
|
|
|