Просмотр исходного кода

增加物料型号和类目搜索联想词方法

dongbw 7 лет назад
Родитель
Сommit
9a2a597f3b

+ 31 - 15
mall-search/src/main/java/com/uas/search/controller/SearchController.java

@@ -42,21 +42,6 @@ public class SearchController {
 	@Autowired
 	private SearchService searchService;
 
-	/**
-	 * 所有物料
-	 */
-	private static final String ALL_PRODUCTS = "all";
-
-	/**
-	 * 标准物料
-	 */
-	private static final String STANDARD_PRODUCTS = "standard";
-
-	/**
-	 * 非标物料
-	 */
-	private static final String NONSTANDARD_PRODUCTS = "nStandard";
-
 	private Logger logger = LoggerFactory.getLogger(getClass());
 
 	/**
@@ -77,6 +62,37 @@ public class SearchController {
 		return searchService.getProductIds(enUU, keyword, page, size, type);
 	}
 
+	/**
+	 * 获取标准型号联想词
+	 * @param keyword 关键词
+	 * @param size 尺寸
+	 * @param request
+	 * @return
+	 */
+	@RequestMapping("/product/similarPCmpCodes")
+	@ResponseBody
+	public List<Map<String, Object>> getSimilarPCmpCodes(@RequestParam String keyword, Integer size,
+														  HttpServletRequest request) {
+		long start = System.currentTimeMillis();
+		List<Map<String, Object>> temp = searchService.getSimilarPCmpCodes(keyword, size);
+		System.out.println("eee" + (System.currentTimeMillis() - start));
+		return temp;
+	}
+
+	/**
+	 * 获取类目联想词
+	 * @param keyword 关键词
+	 * @param size 尺寸
+	 * @param request
+	 * @return
+	 */
+	@RequestMapping("/product/similarKind")
+	@ResponseBody
+	public List<Map<String, Object>> getSimilarKind(@RequestParam String keyword, Integer size,
+														HttpServletRequest request) {
+		return searchService.getSimilarKind(keyword, size);
+	}
+
 	/**
 	 * 根据id获取索引详情
 	 * @param id

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

@@ -541,4 +541,20 @@ public interface SearchService {
 	 * @return
 	 */
     V_Products getProduct(Long id) throws IOException;
+
+	/**
+	 * 获取标准型号联想词
+	 * @param keyword 关键词
+	 * @param size 尺寸
+	 * @return
+	 */
+	List<Map<String,Object>> getSimilarPCmpCodes(String keyword, Integer size);
+
+	/**
+	 * 获取类目联想词
+	 * @param keyword 关键词
+	 * @param size 尺寸
+	 * @return
+	 */
+	List<Map<String,Object>> getSimilarKind(String keyword, Integer size);
 }

+ 85 - 0
mall-search/src/main/java/com/uas/search/service/impl/SearchServiceImpl.java

@@ -70,6 +70,11 @@ public class SearchServiceImpl implements SearchService {
 	 */
 	private static final int SIMILAR_NUM = 20;
 
+	/**
+	 * 获取联想词时返回的最大数目
+	 */
+	private static final int SIMILAR_NUM_EIGHT = 8;
+
 	/**
 	 * 所有物料
 	 */
@@ -1656,6 +1661,86 @@ public class SearchServiceImpl implements SearchService {
                 SearchUtils.getDocumentById(SearchConstants.PRODUCTS_PRIVATE_TABLE_NAME, SearchConstants.PRODUCT_PRIVATE_ID_FIELD, id));
     }
 
+	/**
+	 * 获取标准型号联想词
+	 *
+	 * @param keyword 关键词
+	 * @param size    尺寸
+	 * @return
+	 */
+	@Override
+	public List<Map<String, Object>> getSimilarPCmpCodes(String keyword, Integer size) {
+		size = size == null || size < 1 ? SIMILAR_NUM_EIGHT : size;
+		if (SearchUtils.isKeywordInvalid(keyword)) {
+			throw new IllegalArgumentException("输入无效:" + keyword);
+		}
+		IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.PRODUCTS_PRIVATE_TABLE_NAME);
+
+		List<Map<String, Object>> products = new ArrayList<>();
+		try {
+			PrefixQuery prefixQuery = new PrefixQuery(
+					new Term(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD, keyword.toLowerCase()));
+			logger.info(prefixQuery.toString());
+
+			Sort sort = new Sort(new SortField(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD, new StringFieldComparatorSource(keyword)));
+			TopDocs hits = indexSearcher.search(prefixQuery, size, sort);
+			ScoreDoc[] scoreDocs = hits.scoreDocs;
+			for (ScoreDoc scoreDoc : scoreDocs) {
+				Set<String> fieldsToLoad = new HashSet<>();
+				fieldsToLoad.add(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD);
+				Document document = indexSearcher.doc(scoreDoc.doc, fieldsToLoad);
+				Map<String, Object> map = new HashMap<>();
+				map.put("pCmpCode", document.get(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD));
+				products.add(map);
+			}
+		} catch (IOException e) {
+			logger.error("", e);
+		} finally {
+			SearchUtils.releaseIndexSearcher(indexSearcher);
+		}
+		return products;
+	}
+
+	/**
+	 * 获取类目联想词
+	 *
+	 * @param keyword 关键词
+	 * @param size    尺寸
+	 * @return
+	 */
+	@Override
+	public List<Map<String, Object>> getSimilarKind(String keyword, Integer size) {
+		size = size == null || size < 1 ? SIMILAR_NUM_EIGHT : size;
+		if (SearchUtils.isKeywordInvalid(keyword)) {
+			throw new IllegalArgumentException("输入无效:" + keyword);
+		}
+		IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.PRODUCTS_PRIVATE_TABLE_NAME);
+
+		List<Map<String, Object>> products = new ArrayList<>();
+		try {
+			PrefixQuery prefixQuery = new PrefixQuery(
+					new Term(SearchConstants.PRODUCT_PRIVATE_KIND_FIELD, keyword.toLowerCase()));
+			logger.info(prefixQuery.toString());
+
+			Sort sort = new Sort(new SortField(SearchConstants.PRODUCT_PRIVATE_KIND_FIELD, new StringFieldComparatorSource(keyword)));
+			TopDocs hits = indexSearcher.search(prefixQuery, size, sort);
+			ScoreDoc[] scoreDocs = hits.scoreDocs;
+			for (ScoreDoc scoreDoc : scoreDocs) {
+				Set<String> fieldsToLoad = new HashSet<>();
+				fieldsToLoad.add(SearchConstants.PRODUCT_PRIVATE_KIND_FIELD);
+				Document document = indexSearcher.doc(scoreDoc.doc, fieldsToLoad);
+				Map<String, Object> map = new HashMap<>();
+				map.put("kind", document.get(SearchConstants.PRODUCT_PRIVATE_KIND_FIELD));
+				products.add(map);
+			}
+		} catch (IOException e) {
+			logger.error("", e);
+		} finally {
+			SearchUtils.releaseIndexSearcher(indexSearcher);
+		}
+		return products;
+	}
+
 	@Override
 	public Kind getKind(Long id) throws IOException {
 		return DocumentToObjectUtils.toKind(