Ver Fonte

增加在售商品类目联想词

wangyc há 7 anos atrás
pai
commit
7462b99ba0

+ 42 - 3
mall-search/src/main/java/com/uas/search/controller/SearchController.java

@@ -291,10 +291,49 @@ public class SearchController {
 		return searchService.getSimilarPropertyValues(kindId, propertyId, keyword, topNum);
 		return searchService.getSimilarPropertyValues(kindId, propertyId, keyword, topNum);
 	}
 	}
 
 
-	@RequestMapping("/similarGoods")
+	/**
+	 * 获取在售商品型号联想词
+	 * @param keyword 关键词
+	 * @param storeType 店铺类型
+	 * @param size 个数
+	 * @param request request
+	 * @return
+	 * @throws IOException
+	 */
+	@RequestMapping("/similarGoods/cmpcode")
+	@ResponseBody
+	public Set<Map<String, Object>> getSimilarGoodsCode(String keyword, String storeType, Integer size, HttpServletRequest request) throws IOException {
+		return searchService.getSimilarGoodsCode(keyword, storeType, size);
+	}
+
+	/**
+	 * 获取在售商品品牌联想词
+	 * @param keyword 关键词
+	 * @param storeType 店铺类型
+	 * @param size 个数
+	 * @param request request
+	 * @return
+	 * @throws IOException
+	 */
+	@RequestMapping("/similarGoods/brand")
+	@ResponseBody
+	public Set<Map<String, Object>> getSimilarGoodsBrand(String keyword, String storeType, Integer size, HttpServletRequest request) throws IOException {
+		return searchService.getSimilarGoodsBrand(keyword, storeType, size);
+	}
+
+	/**
+	 * 获取在售商品类目联想词
+	 * @param keyword 关键词
+	 * @param storeType 店铺类型
+	 * @param size 个数
+	 * @param request request
+	 * @return
+	 * @throws IOException
+	 */
+	@RequestMapping("/similarGoods/kind")
 	@ResponseBody
 	@ResponseBody
-	public Set<Map<String, Object>> getSimilarGoods(String keyword, String storeType, Integer size, HttpServletRequest request) throws IOException {
-		return searchService.getSimilarGoods(keyword, storeType, size);
+	public Set<Map<String, Object>> getSimilarGoodsKind(String keyword, String storeType, Integer size, HttpServletRequest request) throws IOException {
+		return searchService.getSimilarGoodsKind(keyword, storeType, size);
 	}
 	}
 
 
     public Map<FilterField, Object> parseFilters(JSONObject json){
     public Map<FilterField, Object> parseFilters(JSONObject json){

+ 24 - 9
mall-search/src/main/java/com/uas/search/service/SearchService.java

@@ -270,16 +270,31 @@ public interface SearchService {
 	public List<Map<String, String>> getSimilarPropertyValues(Long kindId, Long propertyId, String keyword, Long topNum);
 	public List<Map<String, String>> getSimilarPropertyValues(Long kindId, Long propertyId, String keyword, Long topNum);
 
 
 	/**
 	/**
-	 * 根据类目id、属性id、属性值获取联想词
-	 * @param keyword
-	 *            (可选) 属性值(部分字符)
-	 * @param size
-	 *            (可选) 获取的最大数目
-	 * @param storeType
-	 * 			  (可选) 店铺类型
-	 * @return 相似的属性值,包括propertyValue
+	 * 获取在售商品型号联想词
+	 * @param keyword 关键词
+	 * @param storeType 店铺类型
+	 * @param size 个数
+	 * @throws IOException
+	 */
+	public Set<Map<String, Object>> getSimilarGoodsCode(String keyword, String storeType, Integer size) throws IOException;
+
+	/**
+	 * 获取在售商品品牌联想词
+	 * @param keyword 关键词
+	 * @param storeType 店铺类型
+	 * @param size 个数
+	 * @throws IOException
+	 */
+	public Set<Map<String, Object>> getSimilarGoodsBrand(String keyword, String storeType, Integer size) throws IOException;
+
+	/**
+	 * 获取在售商品类目联想词
+	 * @param keyword 关键词
+	 * @param storeType 店铺类型
+	 * @param size 个数
+	 * @throws IOException
 	 */
 	 */
-	public Set<Map<String, Object>> getSimilarGoods(String keyword, String storeType, Integer size) throws IOException;
+	public Set<Map<String, Object>> getSimilarGoodsKind(String keyword, String storeType, Integer size) throws IOException;
 
 
 	/**
 	/**
 	 * 根据关键词搜索批次(关键词可能是器件、类目、品牌)
 	 * 根据关键词搜索批次(关键词可能是器件、类目、品牌)

+ 128 - 13
mall-search/src/main/java/com/uas/search/service/impl/SearchServiceImpl.java

@@ -1,5 +1,11 @@
 package com.uas.search.service.impl;
 package com.uas.search.service.impl;
 
 
+import static com.uas.search.constant.SearchConstants.GOODS_BR_NAME_CN_FIELD;
+import static com.uas.search.constant.SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD;
+import static com.uas.search.constant.SearchConstants.GOODS_BR_NAME_EN_FIELD;
+import static com.uas.search.constant.SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD;
+import static com.uas.search.constant.SearchConstants.GOODS_KI_NAME_CN_FIELD;
+import static com.uas.search.constant.SearchConstants.GOODS_KI_NAME_CN_UNTOKENIZED_FIELD;
 import static com.uas.search.constant.SearchConstants.GOODS_PR_PCMPCODE_FIELD;
 import static com.uas.search.constant.SearchConstants.GOODS_PR_PCMPCODE_FIELD;
 import static com.uas.search.constant.model.Sort.Field.PRICE;
 import static com.uas.search.constant.model.Sort.Field.PRICE;
 import static com.uas.search.constant.model.Sort.Field.RESERVE;
 import static com.uas.search.constant.model.Sort.Field.RESERVE;
@@ -1413,7 +1419,7 @@ public class SearchServiceImpl implements SearchService {
 	}
 	}
 
 
     @Override
     @Override
-    public Set<Map<String, Object>> getSimilarGoods(String keyword, String storeType, Integer size) throws IOException {
+    public Set<Map<String, Object>> getSimilarGoodsCode(String keyword, String storeType, Integer size) throws IOException {
         size = size == null || size < 1 ? SIMILAR_NUM : size;
         size = size == null || size < 1 ? SIMILAR_NUM : size;
         if (SearchUtils.isKeywordInvalid(keyword)) {
         if (SearchUtils.isKeywordInvalid(keyword)) {
             throw new IllegalArgumentException("输入无效:" + keyword);
             throw new IllegalArgumentException("输入无效:" + keyword);
@@ -1424,6 +1430,9 @@ public class SearchServiceImpl implements SearchService {
         try {
         try {
             List<String> storeTypes = new ArrayList<>();
             List<String> storeTypes = new ArrayList<>();
             BooleanQuery booleanQuery = new BooleanQuery();
             BooleanQuery booleanQuery = new BooleanQuery();
+            List<Long> status = Arrays.asList(TradeGoods.VALID_STATUS);
+            filter(status, SearchConstants.GOODS_GO_STATUS_FIELD, booleanQuery);
+
             if (!StringUtils.isEmpty(storeType)) {
             if (!StringUtils.isEmpty(storeType)) {
                 storeTypes = Arrays.asList(storeType.split(","));
                 storeTypes = Arrays.asList(storeType.split(","));
             }
             }
@@ -1439,6 +1448,7 @@ public class SearchServiceImpl implements SearchService {
             goods.addAll(collector.getCollectValues());
             goods.addAll(collector.getCollectValues());
 
 
             BooleanQuery booleanQueryPre = new BooleanQuery();
             BooleanQuery booleanQueryPre = new BooleanQuery();
+            filter(status, SearchConstants.GOODS_GO_STATUS_FIELD, booleanQueryPre);
             if (!CollectionUtils.isEmpty(storeTypes)) {
             if (!CollectionUtils.isEmpty(storeTypes)) {
                 filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQueryPre);
                 filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQueryPre);
             }
             }
@@ -1454,6 +1464,111 @@ public class SearchServiceImpl implements SearchService {
         return goods;
         return goods;
     }
     }
 
 
+    @Override
+    public Set<Map<String, Object>> getSimilarGoodsBrand(String keyword, String storeType, Integer size)
+        throws IOException {
+        size = size == null || size < 1 ? SIMILAR_NUM : size;
+        if (SearchUtils.isKeywordInvalid(keyword)) {
+            throw new IllegalArgumentException("输入无效:" + keyword);
+        }
+        IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.GOODS_TABLE_NAME);
+
+        Set<Map<String, Object>> goods = new HashSet<>();
+        try {
+            List<String> storeTypes = new ArrayList<>();
+            BooleanQuery booleanQuery = new BooleanQuery();
+            List<Long> status = Arrays.asList(TradeGoods.VALID_STATUS);
+            filter(status, SearchConstants.GOODS_GO_STATUS_FIELD, booleanQuery);
+
+            if (!StringUtils.isEmpty(storeType)) {
+                storeTypes = Arrays.asList(storeType.split(","));
+            }
+            if (!CollectionUtils.isEmpty(storeTypes)) {
+                filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQuery);
+            }
+            DistinctGroupCollector.CollectField[] collectFields = new DistinctGroupCollector.CollectField[] {
+                new DistinctGroupCollector.CollectField(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, GOODS_BR_NAME_EN_UNTOKENIZED_FIELD)
+            };
+            DistinctGroupCollector collector = new DistinctGroupCollector(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, collectFields);
+            booleanQuery.add(new TermQuery(new Term(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, keyword.toLowerCase())), Occur.MUST);
+            indexSearcher.search(booleanQuery, collector);
+            goods.addAll(collector.getCollectValues());
+
+            BooleanQuery booleanQueryPre = new BooleanQuery();
+            filter(status, SearchConstants.GOODS_GO_STATUS_FIELD, booleanQueryPre);
+            if (!CollectionUtils.isEmpty(storeTypes)) {
+                filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQueryPre);
+            }
+            booleanQueryPre.add(new PrefixQuery(new Term(GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, keyword.toLowerCase())), Occur.MUST);
+            booleanQueryPre.add(new PrefixQuery(new Term(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, keyword.toLowerCase())), Occur.MUST);
+            logger.info(booleanQueryPre.toString());
+            indexSearcher.search(booleanQueryPre, collector);
+            goods.addAll(collector.getCollectValues());
+
+//            BooleanQuery booleanQueryPre = new BooleanQuery();
+//            if (!CollectionUtils.isEmpty(storeTypes)) {
+//                filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQueryPre);
+//            }
+//            booleanQueryPre.add(SearchUtils.getBooleanQuery(SearchConstants.GOODS_BR_NAME_CN_FIELD, keyword.toLowerCase()), Occur.SHOULD);
+//            booleanQueryPre.add(SearchUtils.getBooleanQuery(SearchConstants.GOODS_BR_NAME_EN_FIELD, keyword.toLowerCase()), Occur.SHOULD);
+//            logger.info(booleanQueryPre.toString());
+//            indexSearcher.search(booleanQueryPre, collector);
+//            goods.addAll(collector.getCollectValues());
+        } catch (IOException e) {
+            logger.error("", e);
+        } finally {
+            releaseIndexSearcher(indexSearcher);
+        }
+        return goods;
+    }
+
+    @Override
+    public Set<Map<String, Object>> getSimilarGoodsKind(String keyword, String storeType, Integer size)
+        throws IOException {
+        size = size == null || size < 1 ? SIMILAR_NUM : size;
+        if (SearchUtils.isKeywordInvalid(keyword)) {
+            throw new IllegalArgumentException("输入无效:" + keyword);
+        }
+        IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.GOODS_TABLE_NAME);
+
+        Set<Map<String, Object>> goods = new HashSet<>();
+        try {
+            List<String> storeTypes = new ArrayList<>();
+            BooleanQuery booleanQuery = new BooleanQuery();
+            List<Long> status = Arrays.asList(TradeGoods.VALID_STATUS);
+            filter(status, SearchConstants.GOODS_GO_STATUS_FIELD, booleanQuery);
+
+            if (!StringUtils.isEmpty(storeType)) {
+                storeTypes = Arrays.asList(storeType.split(","));
+            }
+            if (!CollectionUtils.isEmpty(storeTypes)) {
+                filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQuery);
+            }
+            DistinctGroupCollector.CollectField[] collectFields = new DistinctGroupCollector.CollectField[] {
+                new DistinctGroupCollector.CollectField(GOODS_KI_NAME_CN_FIELD, GOODS_KI_NAME_CN_FIELD),
+            };
+            DistinctGroupCollector collector = new DistinctGroupCollector(GOODS_KI_NAME_CN_FIELD, collectFields);
+            booleanQuery.add(new TermQuery(new Term(GOODS_KI_NAME_CN_UNTOKENIZED_FIELD, keyword.toLowerCase())), BooleanClause.Occur.MUST);
+            indexSearcher.search(booleanQuery, collector);
+            goods.addAll(collector.getCollectValues());
+
+            BooleanQuery booleanQueryPre = new BooleanQuery();
+            filter(status, SearchConstants.GOODS_GO_STATUS_FIELD, booleanQueryPre);
+            if (!CollectionUtils.isEmpty(storeTypes)) {
+                filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQueryPre);
+            }
+            booleanQueryPre.add(new PrefixQuery(new Term(GOODS_KI_NAME_CN_FIELD, keyword.toLowerCase())), Occur.MUST);
+            logger.info(booleanQueryPre.toString());
+            indexSearcher.search(booleanQueryPre, collector);
+            goods.addAll(collector.getCollectValues());
+        } catch (IOException e) {
+            logger.error("", e);
+        } finally {
+            releaseIndexSearcher(indexSearcher);
+        }
+        return goods;
+    }
+
     /**
     /**
 	 * 根据输入获取相似的器件原厂型号
 	 * 根据输入获取相似的器件原厂型号
 	 * 
 	 * 
@@ -1632,8 +1747,8 @@ public class SearchServiceImpl implements SearchService {
 	public Map<String, Object> getOldGoodsIds(String keyword, PageParams pageParams) throws IOException {
 	public Map<String, Object> getOldGoodsIds(String keyword, PageParams pageParams) throws IOException {
 		List<String> keywordFields = new ArrayList<>();
 		List<String> keywordFields = new ArrayList<>();
 		// 先根据品牌搜索,品牌不存在再搜索型号等
 		// 先根据品牌搜索,品牌不存在再搜索型号等
-		keywordFields.add(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD);
-		keywordFields.add(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD);
+		keywordFields.add(GOODS_BR_NAME_CN_UNTOKENIZED_FIELD);
+		keywordFields.add(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD);
 		Map<String, Object> goodsIds = getOldGoodsIds(keyword, keywordFields, false, pageParams);
 		Map<String, Object> goodsIds = getOldGoodsIds(keyword, keywordFields, false, pageParams);
 		if (CollectionUtils.isEmpty(goodsIds) || goodsIds.get("componentIds") == null
 		if (CollectionUtils.isEmpty(goodsIds) || goodsIds.get("componentIds") == null
 			|| JSONObject.parseArray(goodsIds.get("componentIds").toString()).isEmpty()) {
 			|| JSONObject.parseArray(goodsIds.get("componentIds").toString()).isEmpty()) {
@@ -2102,8 +2217,8 @@ public class SearchServiceImpl implements SearchService {
                 // 如果仍然无法得到正确结果,就根据按照型号等顺序严格排列
                 // 如果仍然无法得到正确结果,就根据按照型号等顺序严格排列
 //                new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword, false)),
 //                new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword, false)),
                 new SortField(GOODS_PR_PCMPCODE_FIELD, new StringFieldComparatorSource(keyword, false)),
                 new SortField(GOODS_PR_PCMPCODE_FIELD, new StringFieldComparatorSource(keyword, false)),
-                new SortField(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, false)),
-                new SortField(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, false)),
+                new SortField(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, false)),
+                new SortField(GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, false)),
                 new SortField(SearchConstants.GOODS_PR_KIND_FIELD, new StringFieldComparatorSource(keyword, false)),
                 new SortField(SearchConstants.GOODS_PR_KIND_FIELD, new StringFieldComparatorSource(keyword, false)),
                 new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword, false)),
                 new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword, false)),
 //                new SortField(SearchConstants.GOODS_KI_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, false)),
 //                new SortField(SearchConstants.GOODS_KI_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, false)),
@@ -2344,8 +2459,8 @@ public class SearchServiceImpl implements SearchService {
 			Map<FilterField, Object> filters) throws IOException {
 			Map<FilterField, Object> filters) throws IOException {
 		List<String> keywordFields = new ArrayList<>();
 		List<String> keywordFields = new ArrayList<>();
 		// 先根据品牌搜索,品牌不存在再搜索型号等
 		// 先根据品牌搜索,品牌不存在再搜索型号等
-		keywordFields.add(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD);
-		keywordFields.add(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD);
+		keywordFields.add(GOODS_BR_NAME_CN_UNTOKENIZED_FIELD);
+		keywordFields.add(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD);
 		List<Map<String, Object>> result = collectBySearchGoods(keyword, keywordFields, false, collectedField, filters);
 		List<Map<String, Object>> result = collectBySearchGoods(keyword, keywordFields, false, collectedField, filters);
 		if (CollectionUtils.isEmpty(result)) {
 		if (CollectionUtils.isEmpty(result)) {
             keyword = recursivelyGetGoodsIds(keyword, null, true);
             keyword = recursivelyGetGoodsIds(keyword, null, true);
@@ -2575,14 +2690,14 @@ public class SearchServiceImpl implements SearchService {
 			case GOODS_KIND:
 			case GOODS_KIND:
 				uniqueField = SearchConstants.GOODS_KI_ID_FIELD;
 				uniqueField = SearchConstants.GOODS_KI_ID_FIELD;
 				fieldsToLoad.add(SearchConstants.GOODS_KI_ID_FIELD);
 				fieldsToLoad.add(SearchConstants.GOODS_KI_ID_FIELD);
-				fieldsToLoad.add(SearchConstants.GOODS_KI_NAME_CN_FIELD);
+				fieldsToLoad.add(GOODS_KI_NAME_CN_FIELD);
 				break;
 				break;
 			case GOODS_BRAND:
 			case GOODS_BRAND:
 				uniqueField = SearchConstants.GOODS_BR_ID_FIELD;
 				uniqueField = SearchConstants.GOODS_BR_ID_FIELD;
 				fieldsToLoad.add(SearchConstants.GOODS_BR_ID_FIELD);
 				fieldsToLoad.add(SearchConstants.GOODS_BR_ID_FIELD);
 				fieldsToLoad.add(SearchConstants.GOODS_BR_UUID_FIELD);
 				fieldsToLoad.add(SearchConstants.GOODS_BR_UUID_FIELD);
-				fieldsToLoad.add(SearchConstants.GOODS_BR_NAME_CN_FIELD);
-				fieldsToLoad.add(SearchConstants.GOODS_BR_NAME_EN_FIELD);
+				fieldsToLoad.add(GOODS_BR_NAME_CN_FIELD);
+				fieldsToLoad.add(GOODS_BR_NAME_EN_FIELD);
 				break;
 				break;
 			case GOODS_STORE_TYPE:
 			case GOODS_STORE_TYPE:
 				uniqueField = SearchConstants.GOODS_ST_TYPE_FIELD;
 				uniqueField = SearchConstants.GOODS_ST_TYPE_FIELD;
@@ -2674,10 +2789,10 @@ public class SearchServiceImpl implements SearchService {
 		// 非标
 		// 非标
 		booleanQuery.add(createQuery(GOODS_PR_PCMPCODE_FIELD, keyword, 100), Occur.SHOULD);
 		booleanQuery.add(createQuery(GOODS_PR_PCMPCODE_FIELD, keyword, 100), Occur.SHOULD);
 		// 品牌
 		// 品牌
-		booleanQuery.add(createQuery(SearchConstants.GOODS_BR_NAME_CN_FIELD, keyword, 10), BooleanClause.Occur.SHOULD);
-		booleanQuery.add(createQuery(SearchConstants.GOODS_BR_NAME_EN_FIELD, keyword, 10), BooleanClause.Occur.SHOULD);
+		booleanQuery.add(createQuery(GOODS_BR_NAME_CN_FIELD, keyword, 10), BooleanClause.Occur.SHOULD);
+		booleanQuery.add(createQuery(GOODS_BR_NAME_EN_FIELD, keyword, 10), BooleanClause.Occur.SHOULD);
 		// 类目
 		// 类目
-		booleanQuery.add(createQuery(SearchConstants.GOODS_KI_NAME_CN_FIELD, keyword, 1), BooleanClause.Occur.SHOULD);
+		booleanQuery.add(createQuery(GOODS_KI_NAME_CN_FIELD, keyword, 1), BooleanClause.Occur.SHOULD);
 		// 属性值
 		// 属性值
 		booleanQuery.add(createQuery(SearchConstants.GOODS_CMP_DESCRIPTION_FIELD, keyword, 1), BooleanClause.Occur.SHOULD);
 		booleanQuery.add(createQuery(SearchConstants.GOODS_CMP_DESCRIPTION_FIELD, keyword, 1), BooleanClause.Occur.SHOULD);
 		return booleanQuery;
 		return booleanQuery;