Explorar o código

change the sort strategy

sunyj %!s(int64=8) %!d(string=hai) anos
pai
achega
e136b26817

+ 3 - 4
mall-search/src/main/java/com/uas/search/constant/model/PageParams.java

@@ -2,7 +2,6 @@ package com.uas.search.constant.model;
 
 import java.io.Serializable;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -33,7 +32,7 @@ public class PageParams implements Serializable {
 	/**
 	 * 排序
 	 */
-	private List<Sort> sort;
+	private Sort sort;
 
 	public PageParams() {
 	}
@@ -98,11 +97,11 @@ public class PageParams implements Serializable {
 	/**
 	 * @return 排序
 	 */
-	public List<Sort> getSort() {
+	public Sort getSort() {
 		return sort;
 	}
 
-	public void setSort(List<Sort> sort) {
+	public void setSort(Sort sort) {
 		this.sort = sort;
 	}
 

+ 4 - 13
mall-search/src/main/java/com/uas/search/constant/model/Sort.java

@@ -81,25 +81,16 @@ public class Sort implements Serializable {
 	 * @since 2017年7月8日 下午5:12:07
 	 */
 	public enum Field {
-		/**
-		 * 批次库存
-		 */
-		GO_RESERVE,
-
-		/**
-		 * 批次价格(人民币)
-		 */
-		GO_MINPRICERMB,
 
 		/**
-		 * 批次价格(美元)
+		 * 库存
 		 */
-		GO_MINPRICEUSD,
+		RESERVE,
 
 		/**
-		 * 批次搜索(由器件、品牌、类目等因素决定,不受reverse和missingValue影响
+		 * 价格(人民币)
 		 */
-		GO_SEARCH;
+		PRICE
 	}
 
 }

+ 73 - 59
mall-search/src/main/java/com/uas/search/service/impl/SearchServiceImpl.java

@@ -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