Bläddra i källkod

调整品牌搜索店铺结果去重

wangyc 7 år sedan
förälder
incheckning
82389ca1d2

+ 41 - 10
mall-search/src/main/java/com/uas/search/service/impl/SearchServiceImpl.java

@@ -32,6 +32,8 @@ import java.io.IOException;
 import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -102,6 +104,11 @@ public class SearchServiceImpl implements SearchService {
 	 */
 	private static final int PAGE_SIZE = 20;
 
+	/**
+	 * 默认每页的大小
+	 */
+	private static final int BRAND_PAGE_SIZE = 100;
+
 	private static Logger logger = LoggerFactory.getLogger(SearchServiceImpl.class);
 
 	/**
@@ -1662,9 +1669,9 @@ public class SearchServiceImpl implements SearchService {
 			sPage.setFirst(true);
 		}
 		if (size != null && size > 0) {
-			sPage.setSize(size);
+			sPage.setSize(indexName.equals(SearchConstants.BRAND) ? BRAND_PAGE_SIZE : size);
 		} else {
-			sPage.setSize(PAGE_SIZE);
+			sPage.setSize(indexName.equals(SearchConstants.BRAND) ? BRAND_PAGE_SIZE : PAGE_SIZE);
 		}
 
 		DuplicateFilter duplicateFilter = null;
@@ -1704,13 +1711,6 @@ public class SearchServiceImpl implements SearchService {
 			}
 
 			int totalHits = topDocs.totalHits;
-			// 设置总元素个数、页数等信息
-			sPage.setTotalElement(totalHits);
-			int totalPage = (int) Math.ceil(totalHits / (1.0 * sPage.getSize()));
-			sPage.setTotalPage(totalPage);
-			if (totalPage == sPage.getPage()) {
-				sPage.setLast(true);
-			}
 
 			List<Document> documents = new ArrayList<>();
 			for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
@@ -1719,14 +1719,45 @@ public class SearchServiceImpl implements SearchService {
 
 			List<Object> content = new ArrayList<>();
 			if (indexName.equals(SearchConstants.GOODS_TABLE_NAME)) {
+				Map<String, List<Object>> map = new HashMap<>();
+				List<Object> allStoreUuids = new ArrayList<>();
 				for (Document document : documents) {
-					content.add(document.get(SearchConstants.GOODS_ST_UUID_FIELD));
+					allStoreUuids.add(document.get(SearchConstants.GOODS_ST_UUID_FIELD));
+				}
+				// 按店铺分组
+				for (Object object : allStoreUuids) {
+					if (map.get(String.valueOf(object)) == null) {
+						List<Object> storeUuids = new ArrayList<>();
+						storeUuids.add(String.valueOf(object));
+						map.put(String.valueOf(object), storeUuids);
+					} else {
+						map.get(String.valueOf(object)).add(object);
+						totalHits --;
+					}
+				}
+				List<Map.Entry<String, List<Object>>> stuuids = new ArrayList<>(map.entrySet());
+				Collections.sort(stuuids, new Comparator<Map.Entry<String, List<Object>>> () {
+					@Override
+					public int compare(Map.Entry<String, List<Object>> o1, Map.Entry<String, List<Object>> o2) {
+						return o1.getValue().size() - o2.getValue().size();
+					}
+				});
+				size = size == null ? PAGE_SIZE : size;
+				for (int i = 0; i < (stuuids.size() < size ?  stuuids.size() : size) ; i ++) {
+					content.add(stuuids.get(i).getKey());
 				}
 			} else if (indexName.equals(SearchConstants.PRODUCTS_PRIVATE_TABLE_NAME)) {
 				for (Document document : documents) {
 					content.add(Long.parseLong(document.get(SearchConstants.PRODUCT_PRIVATE_ENUU_FIELD)));
 				}
 			}
+			// 设置总元素个数、页数等信息
+			int totalPage = (int) Math.ceil(totalHits / (1.0 * sPage.getSize()));
+			sPage.setTotalPage(totalPage);
+			if (totalPage == sPage.getPage()) {
+				sPage.setLast(true);
+			}
+			sPage.setTotalElement(totalHits);
 			sPage.setContent(content);
 		} finally {
 			releaseIndexSearcher(indexSearcher);