Browse Source

增加物料联系词

wangyc 7 years ago
parent
commit
f48e007ee9

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

@@ -235,6 +235,13 @@ public class SearchController {
 		return searchService.getSimilarComponents(keyword, size);
 	}
 
+    @RequestMapping("/similarProducts")
+    @ResponseBody
+    public List<Map<String, Object>> getSimilarProducts(@RequestParam String keyword, Integer size,
+        HttpServletRequest request) {
+        return searchService.getSimilarProducts(keyword, size);
+    }
+
 	@RequestMapping("/similarBrands")
 	@ResponseBody
 	public List<Map<String, Object>> getSimilarBrands(@RequestParam String keyword, Integer size, HttpServletRequest request) throws IOException {

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

@@ -203,6 +203,15 @@ public interface SearchService {
 	 */
 	public List<Map<String, Object>> getSimilarComponents(String componentCode, Integer size) ;
 
+	/**
+	 * 根据输入的物料型号获取联想词
+	 *
+	 * @param code
+	 * @param size 指定的联想词数目
+	 * @return 包括id、uuid、code
+	 */
+	List<Map<String, Object>> getSimilarProducts(String code, Integer size) ;
+
 	/**
 	 * 根据输入的品牌获取联想词
 	 * 

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

@@ -797,7 +797,65 @@ public class SearchServiceImpl implements SearchService {
 		return components;
 	}
 
-	@Override
+    @Override
+    public List<Map<String, Object>> getSimilarProducts(String code, Integer size) {
+        size = size == null || size < 1 ? SIMILAR_NUM : size;
+        if (SearchUtils.isKeywordInvalid(code)) {
+            throw new IllegalArgumentException("输入无效:" + code);
+        }
+        IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.PRODUCTS_PRIVATE_TABLE_NAME);
+
+        List<Map<String, Object>> products = new ArrayList<>();
+        try {
+			String termCode = "";
+			TermQuery termQuery = new TermQuery(new Term(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD, code.toLowerCase()));
+			TopDocs termHits = indexSearcher.search(termQuery, 1);
+
+			if (termHits.totalHits > 0) {
+				for (ScoreDoc scoreDoc : termHits.scoreDocs) {
+					Set<String> fieldsToLoad = new HashSet<>();
+					fieldsToLoad.add(SearchConstants.PRODUCT_PRIVATE_ID_FIELD);
+					fieldsToLoad.add(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD);
+					Document document = indexSearcher.doc(scoreDoc.doc, fieldsToLoad);
+					Map<String, Object> map = new HashMap<>();
+					map.put("id", Long.parseLong(document.get(SearchConstants.PRODUCT_PRIVATE_ID_FIELD)));
+					map.put("pcmpcode", document.get(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD));
+					termCode = String.valueOf(map.get("pcmpcode"));
+					products.add(map);
+				}
+			}
+
+            PrefixQuery prefixQuery = new PrefixQuery(
+                new Term(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD, code.toLowerCase()));
+            logger.info(prefixQuery.toString());
+            // 物料型号重复率过高,故先去重
+            DuplicateFilter codeFilter = new DuplicateFilter(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD);
+            Sort sort = new Sort(new SortField(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD, new StringFieldComparatorSource(code, true)));
+            TopDocs hits = indexSearcher.search(prefixQuery, codeFilter, size * 2, sort, true, false);
+            ScoreDoc[] scoreDocs = hits.scoreDocs;
+            String pcmpcode = "";
+            for (ScoreDoc scoreDoc : scoreDocs) {
+                Set<String> fieldsToLoad = new HashSet<>();
+                fieldsToLoad.add(SearchConstants.PRODUCT_PRIVATE_ID_FIELD);
+                fieldsToLoad.add(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD);
+                Document document = indexSearcher.doc(scoreDoc.doc, fieldsToLoad);
+                Map<String, Object> map = new HashMap<>();
+                map.put("id", Long.parseLong(document.get(SearchConstants.PRODUCT_PRIVATE_ID_FIELD)));
+                map.put("pcmpcode", document.get(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD));
+                if (!pcmpcode.equals(map.get("pcmpcode")) && !termCode.equals(map.get("pcmpcode"))) {
+                    products.add(map);
+                    pcmpcode = String.valueOf(map.get("pcmpcode"));
+                }
+            }
+        } catch (IOException e) {
+            logger.error("", e);
+        } finally {
+            releaseIndexSearcher(indexSearcher);
+        }
+        return products;
+    }
+
+    @Override
 	public List<Map<String, Object>> getSimilarBrands(String brandName, Integer size) throws IOException {
 		size = size == null || size < 1 ? SIMILAR_NUM : size;
 		if (SearchUtils.isKeywordInvalid(brandName)) {