瀏覽代碼

增加在售产品联想词接口

wangyc 6 年之前
父節點
當前提交
be1cc7b1e2

+ 6 - 0
mall-search/src/main/java/com/uas/search/controller/SearchController.java

@@ -291,6 +291,12 @@ public class SearchController {
 		return searchService.getSimilarPropertyValues(kindId, propertyId, keyword, topNum);
 	}
 
+	@RequestMapping("/similarGoods")
+	@ResponseBody
+	public Set<Map<String, Object>> getSimilarGoods(String keyword, String storeType, Integer size, HttpServletRequest request) throws IOException {
+		return searchService.getSimilarGoods(keyword, storeType, size);
+	}
+
     public Map<FilterField, Object> parseFilters(JSONObject json){
         Map<FilterField, Object> filters = new HashMap<>();
         if(json!=null){

+ 5 - 1
mall-search/src/main/java/com/uas/search/grouping/DistinctGroupCollector.java

@@ -54,7 +54,11 @@ public class DistinctGroupCollector extends SimpleCollector {
 			Document document = reader.document(doc, fieldsToLoad);
 			String value = document.get(groupField);
 			if (value != null) {
-				values.add(Long.parseLong(value));
+				try {
+					values.add(Long.parseLong(value));
+				} catch (NumberFormatException e) {
+
+				}
 				// 统计指定信息
 				if(!ArrayUtils.isEmpty(collectFields)){
 					Map<String, Object> collectValue = new HashMap<>();

+ 12 - 0
mall-search/src/main/java/com/uas/search/service/SearchService.java

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

+ 71 - 11
mall-search/src/main/java/com/uas/search/service/impl/SearchServiceImpl.java

@@ -1,5 +1,6 @@
 package com.uas.search.service.impl;
 
+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.RESERVE;
 import static com.uas.search.util.SearchUtils.getDocuments;
@@ -222,7 +223,7 @@ public class SearchServiceImpl implements SearchService {
             List<String> keywordFields = null;
             // 若未指定,再获取实体类中所配置的
             if (pageParams != null && !CollectionUtils.isEmpty(pageParams.getKeywordSearchColumns())) {
-                keywordFields = getKeywordFields(tableName, pageParams.getKeywordSearchColumns());
+                keywordFields = getKeywordFields(pageParams.getKeywordSearchColumns());
             } else {
                 keywordFields = ClassAndTableNameUtils.getKeywordFields(tableName);
             }
@@ -510,18 +511,15 @@ public class SearchServiceImpl implements SearchService {
 
     /**
      * 获取指定的可以搜索的字段列名
-     *
-     * @param tableName
-     *            单据类型
      * @param keywordSearchColumns
      *            keyword模糊搜索的字段名称
      * @return 可以搜索的字段列名
      */
-    private List<String> getKeywordFields(Table_name tableName, List<String> keywordSearchColumns) {
+    private List<String> getKeywordFields(List<String> keywordSearchColumns) {
         List<String> result = new ArrayList<>();
         for (String keywordSearchColumn : keywordSearchColumns) {
             // 返回之前先拼接索引域名
-            result.add(ClassAndTableNameUtils.combineField(tableName, keywordSearchColumn));
+            result.add(keywordSearchColumn);
         }
         return result;
     }
@@ -1414,7 +1412,69 @@ public class SearchServiceImpl implements SearchService {
 
 	}
 
-	/**
+    @Override
+    public Set<Map<String, Object>> getSimilarGoods(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();
+            if (!StringUtils.isEmpty(storeType)) {
+                storeTypes = Arrays.asList(storeType.split(","));
+            }
+            if (!CollectionUtils.isEmpty(storeTypes)) {
+                filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQuery);
+            }
+//            String termCode = "";
+            DistinctGroupCollector.CollectField[] collectFields = new DistinctGroupCollector.CollectField[] {
+                new DistinctGroupCollector.CollectField(SearchConstants.GOODS_PR_PCMPCODE_FIELD, SearchConstants.GOODS_PR_PCMPCODE_FIELD)
+            };
+            DistinctGroupCollector collector = new DistinctGroupCollector(SearchConstants.GOODS_PR_PCMPCODE_FIELD, collectFields);
+            booleanQuery.add(new TermQuery(new Term(GOODS_PR_PCMPCODE_FIELD, keyword.toLowerCase())), BooleanClause.Occur.MUST);
+            indexSearcher.search(booleanQuery, collector);
+            goods.addAll(collector.getCollectValues());
+
+            BooleanQuery booleanQueryPre = new BooleanQuery();
+            if (!CollectionUtils.isEmpty(storeTypes)) {
+                filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQueryPre);
+            }
+            booleanQueryPre.add(new PrefixQuery(new Term(GOODS_PR_PCMPCODE_FIELD, keyword.toLowerCase())), Occur.MUST);
+            logger.info(booleanQueryPre.toString());
+//            Sort sort = new Sort(new SortField(GOODS_PR_PCMPCODE_FIELD, new StringFieldComparatorSource(keyword, true)));
+            indexSearcher.search(booleanQueryPre, collector);
+            goods.addAll(collector.getCollectValues());
+//            TopDocs hits = indexSearcher.search(booleanQueryPre, size * 2, sort, true, false);
+//            ScoreDoc[] scoreDocs = hits.scoreDocs;
+//            String pcmpcode = "";
+//            for (ScoreDoc scoreDoc : scoreDocs) {
+//                Set<String> fieldsToLoad = new HashSet<>();
+//                fieldsToLoad.add(SearchConstants.GOODS_GO_ID_FIELD);
+//                fieldsToLoad.add(SearchConstants.GOODS_ST_TYPE_FIELD);
+//                fieldsToLoad.add(GOODS_PR_PCMPCODE_FIELD);
+//                Document document = indexSearcher.doc(scoreDoc.doc, fieldsToLoad);
+//                Map<String, Object> map = new HashMap<>();
+//                map.put("id", Long.parseLong(document.get(SearchConstants.GOODS_GO_ID_FIELD)));
+//                map.put("type", document.get(SearchConstants.GOODS_ST_TYPE_FIELD));
+//                map.put("pcmpcode", document.get(GOODS_PR_PCMPCODE_FIELD));
+//                if (!pcmpcode.equals(map.get("pcmpcode")) && !termCode.equals(map.get("pcmpcode"))) {
+//                    goods.add(map);
+//                    pcmpcode = String.valueOf(map.get("pcmpcode"));
+//                }
+//            }
+        } catch (IOException e) {
+            logger.error("", e);
+        } finally {
+            releaseIndexSearcher(indexSearcher);
+        }
+        return goods;
+    }
+
+    /**
 	 * 根据输入获取相似的器件原厂型号
 	 * 
 	 * @param componentCode
@@ -1560,7 +1620,7 @@ public class SearchServiceImpl implements SearchService {
 		List<String> goodsFields = new ArrayList<>();
 		List<String> productsFields = new ArrayList<>();
 		// 先根据品牌搜索,品牌不存在再搜索型号等
-		goodsFields.add(SearchConstants.GOODS_PR_PCMPCODE_FIELD);
+		goodsFields.add(GOODS_PR_PCMPCODE_FIELD);
 		goodsFields.add(SearchConstants.GOODS_CMP_CODE_FIELD);
 
 		productsFields.add(SearchConstants.PRODUCT_PRIVATE_CMPCODE_FIELD);
@@ -2061,7 +2121,7 @@ public class SearchServiceImpl implements SearchService {
         sortFieldList.addAll(Arrays.asList(
                 // 如果仍然无法得到正确结果,就根据按照型号等顺序严格排列
 //                new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword, false)),
-                new SortField(SearchConstants.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(SearchConstants.GOODS_PR_KIND_FIELD, new StringFieldComparatorSource(keyword, false)),
@@ -2628,11 +2688,11 @@ public class SearchServiceImpl implements SearchService {
 		BooleanQuery booleanQuery = new BooleanQuery();
         // 前缀搜索(字段并未分词,进行分词搜索时,会有边界问题,如搜索 'BC807-40,215')
         booleanQuery.add(new PrefixQuery(new Term(SearchConstants.GOODS_CMP_CODE_FIELD, keyword.toLowerCase())), BooleanClause.Occur.SHOULD);
-        booleanQuery.add(new PrefixQuery(new Term(SearchConstants.GOODS_PR_PCMPCODE_FIELD, keyword.toLowerCase())), BooleanClause.Occur.SHOULD);
+        booleanQuery.add(new PrefixQuery(new Term(GOODS_PR_PCMPCODE_FIELD, keyword.toLowerCase())), BooleanClause.Occur.SHOULD);
 		// 原厂型号
 		booleanQuery.add(createQuery(SearchConstants.GOODS_CMP_CODE_FIELD, keyword, 100), BooleanClause.Occur.SHOULD);
 		// 非标
-		booleanQuery.add(createQuery(SearchConstants.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);