|
|
@@ -30,6 +30,9 @@ import java.io.IOException;
|
|
|
import java.net.URLDecoder;
|
|
|
import java.util.*;
|
|
|
|
|
|
+import static com.uas.search.constant.model.Sort.Field.PRICE;
|
|
|
+import static com.uas.search.constant.model.Sort.Field.RESERVE;
|
|
|
+
|
|
|
/**
|
|
|
* 搜索索引
|
|
|
*
|
|
|
@@ -861,49 +864,7 @@ public class SearchServiceImpl implements SearchService {
|
|
|
setGoodsFilter(pageParams.getFilters(), booleanQuery);
|
|
|
logger.info(booleanQuery.toString());
|
|
|
|
|
|
- // 排序
|
|
|
- // 自定义排序字段 > 批次(访问量) > 器件(访问量 > 搜索次数) > 品牌(权重 > 访问量 > 搜索次数) > 类目(访问量 > 搜索次数) > 分数
|
|
|
- SortField[] customSortFields = sortGoods(keyword);
|
|
|
- List<SortField> sortFieldList = new ArrayList<>();
|
|
|
- sortFieldList.add(new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword, true)));
|
|
|
- sortFieldList.add(new SortField(SearchConstants.GOODS_PR_PCMPCODE_FIELD, new StringFieldComparatorSource(keyword, true)));
|
|
|
- List<com.uas.search.constant.model.Sort> sorts = pageParams.getSort();
|
|
|
- if (sorts != null && !CollectionUtils.isEmpty(sorts)) {
|
|
|
- for (com.uas.search.constant.model.Sort s : sorts) {
|
|
|
- if (s.getField() == null) {
|
|
|
- throw new SearchException("排序字段不可为空:" + s);
|
|
|
- }
|
|
|
- switch (s.getField()) {
|
|
|
- // 库存
|
|
|
- case GO_RESERVE:
|
|
|
- sortFieldList.add(new SortField(SearchConstants.GOODS_GO_RESERVE_FIELD, Type.DOUBLE,
|
|
|
- s.isReverse()));
|
|
|
- break;
|
|
|
- // 人民币价格
|
|
|
- case GO_MINPRICERMB:
|
|
|
- sortFieldList.add(new SortField(SearchConstants.GOODS_GO_MINPRICERMB_FIELD, Type.DOUBLE,
|
|
|
- s.isReverse()));
|
|
|
- break;
|
|
|
- // 美元价格
|
|
|
- case GO_MINPRICEUSD:
|
|
|
- sortFieldList.add(new SortField(SearchConstants.GOODS_GO_MINPRICEUSD_FIELD, Type.DOUBLE,
|
|
|
- s.isReverse()));
|
|
|
- break;
|
|
|
- // 打分
|
|
|
- case GO_SEARCH:
|
|
|
- sortFieldList.addAll(Arrays.asList(customSortFields));
|
|
|
- break;
|
|
|
- default:
|
|
|
- throw new SearchException("不支持该排序方式:" + s.getField());
|
|
|
- }
|
|
|
- }
|
|
|
- } else{
|
|
|
- sortFieldList.addAll(Arrays.asList(customSortFields));
|
|
|
- }
|
|
|
- SortField[] sortFields = new SortField[sortFieldList.size()];
|
|
|
- sortFieldList.toArray(sortFields);
|
|
|
- Sort sort = new Sort(sortFields);
|
|
|
-
|
|
|
+ Sort sort = sortGoods(keyword, pageParams.getSort());
|
|
|
TopDocs hits;
|
|
|
if (pageParams.getPage() > 1) {// 不是第一页
|
|
|
TopDocs previousHits = indexSearcher.search(booleanQuery,
|
|
|
@@ -1045,23 +1006,76 @@ public class SearchServiceImpl implements SearchService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * @return 批次排序规则
|
|
|
+ * 批次排序规则
|
|
|
*/
|
|
|
- private SortField[] sortGoods(String keyword) {
|
|
|
- // 器件、非标型号自定义排序 > 批次(访问量) > 器件(自定义排序 > 访问量 > 搜索次数) > 品牌(自定义排序 > 权重 > 访问量 > 搜索次数) > 类目(访问量 > 搜索次数)
|
|
|
- return new SortField[]{
|
|
|
- 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),
|
|
|
- sortField(SearchConstants.GOODS_BR_WEIGHT_FIELD, Type.DOUBLE, true, Double.MIN_VALUE),
|
|
|
- sortField(SearchConstants.GOODS_BR_VISIT_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
|
|
|
- sortField(SearchConstants.GOODS_BR_SEARCH_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
|
|
|
- sortField(SearchConstants.GOODS_KI_VISIT_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
|
|
|
- sortField(SearchConstants.GOODS_KI_SEARCH_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
|
|
|
- new SortField(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
- new SortField(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
- new SortField(SearchConstants.GOODS_KI_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword))
|
|
|
- };
|
|
|
+ private Sort sortGoods(String keyword, com.uas.search.constant.model.Sort sort) {
|
|
|
+ List<SortField> sortFieldList = new ArrayList<>();
|
|
|
+ if (sort != null) {
|
|
|
+ com.uas.search.constant.model.Sort.Field field = sort.getField();
|
|
|
+ if (field == null) {
|
|
|
+ throw new SearchException("排序字段不可为空:" + sort);
|
|
|
+ }
|
|
|
+ if (field == RESERVE) {
|
|
|
+ // 库存
|
|
|
+ if (sort.isReverse()) {
|
|
|
+ // 降序
|
|
|
+ sortFieldList.add(sortField(SearchConstants.GOODS_GO_RESERVE_FIELD, Type.DOUBLE, true, Double.MIN_VALUE));
|
|
|
+ } else {
|
|
|
+ // 升序
|
|
|
+ sortFieldList.add(sortField(SearchConstants.GOODS_GO_RESERVE_FIELD, Type.DOUBLE, false, Double.MAX_VALUE));
|
|
|
+ }
|
|
|
+ sortFieldList.addAll(Arrays.asList(
|
|
|
+ sortField(SearchConstants.GOODS_GO_MINPRICERMB_FIELD, Type.DOUBLE, false, Double.MAX_VALUE),
|
|
|
+ sortField(SearchConstants.GOODS_GO_MINPRICEUSD_FIELD, Type.DOUBLE, false, Double.MAX_VALUE),
|
|
|
+ SortField.FIELD_SCORE,
|
|
|
+ new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
+ new SortField(SearchConstants.GOODS_PR_PCMPCODE_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
+ new SortField(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
+ new SortField(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
+ sortField(SearchConstants.GOODS_GO_UPDATE_DATE_FIELD, Type.LONG, true, Long.MIN_VALUE)
|
|
|
+ ));
|
|
|
+ } else if (field == PRICE) {
|
|
|
+ // 价格
|
|
|
+ if (sort.isReverse()) {
|
|
|
+ // 降序
|
|
|
+ sortFieldList.add(sortField(SearchConstants.GOODS_GO_MINPRICERMB_FIELD, Type.DOUBLE, true, Double.MIN_VALUE));
|
|
|
+ sortFieldList.add(sortField(SearchConstants.GOODS_GO_MINPRICEUSD_FIELD, Type.DOUBLE, true, Double.MIN_VALUE));
|
|
|
+ } else {
|
|
|
+ // 升序
|
|
|
+ sortFieldList.add(sortField(SearchConstants.GOODS_GO_MINPRICERMB_FIELD, Type.DOUBLE, false, Double.MAX_VALUE));
|
|
|
+ sortFieldList.add(sortField(SearchConstants.GOODS_GO_MINPRICEUSD_FIELD, Type.DOUBLE, false, Double.MAX_VALUE));
|
|
|
+ }
|
|
|
+ sortFieldList.addAll(Arrays.asList(
|
|
|
+ sortField(SearchConstants.GOODS_GO_RESERVE_FIELD, Type.DOUBLE, true, Double.MIN_VALUE),
|
|
|
+ sortField(SearchConstants.GOODS_GO_MINDELIVERY_FIELD, Type.LONG, false, Long.MAX_VALUE),
|
|
|
+ SortField.FIELD_SCORE,
|
|
|
+ new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
+ new SortField(SearchConstants.GOODS_PR_PCMPCODE_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
+ new SortField(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
+ new SortField(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
+ sortField(SearchConstants.GOODS_GO_UPDATE_DATE_FIELD, Type.LONG, true, Long.MIN_VALUE)
|
|
|
+ ));
|
|
|
+ } else {
|
|
|
+ throw new SearchException("不支持该排序方式:" + field);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 默认(综合排序)
|
|
|
+ sortFieldList.addAll(Arrays.asList(
|
|
|
+ sortField(SearchConstants.GOODS_GO_MINPRICERMB_FIELD, Type.DOUBLE, false, Double.MAX_VALUE),
|
|
|
+ sortField(SearchConstants.GOODS_GO_MINPRICEUSD_FIELD, Type.DOUBLE, false, Double.MAX_VALUE),
|
|
|
+ sortField(SearchConstants.GOODS_GO_RESERVE_FIELD, Type.DOUBLE, true, Double.MIN_VALUE),
|
|
|
+ sortField(SearchConstants.GOODS_GO_MINDELIVERY_FIELD, Type.LONG, false, Long.MAX_VALUE),
|
|
|
+ SortField.FIELD_SCORE,
|
|
|
+ new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
+ new SortField(SearchConstants.GOODS_PR_PCMPCODE_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
+ new SortField(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
+ new SortField(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, true)),
|
|
|
+ sortField(SearchConstants.GOODS_GO_UPDATE_DATE_FIELD, Type.LONG, true, Long.MIN_VALUE)
|
|
|
+ ));
|
|
|
+ }
|
|
|
+ SortField[] sortFields = new SortField[sortFieldList.size()];
|
|
|
+ sortFieldList.toArray(sortFields);
|
|
|
+ return new Sort(sortFields);
|
|
|
}
|
|
|
|
|
|
@Override
|