Преглед на файлове

恢复原goodsIds获取接口

wangyc преди 6 години
родител
ревизия
2b596da181

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

@@ -310,6 +310,24 @@ public class SearchController {
         return goodsIds;
     }
 
+	/**
+	 * 原goodIds搜索接口
+	 * @param keyword
+	 * @param params
+	 * @param request
+	 * @return
+	 * @throws IOException
+	 */
+	@RequestMapping("/oldGoodsIds")
+	@ResponseBody
+	public Map<String, Object> getOldGoodsIds(String keyword, String params, HttpServletRequest request) throws IOException {
+		long start = System.currentTimeMillis();
+		PageParams pageParams = params == null ? null : JSONObject.parseObject(params, PageParams.class);
+		Map<String, Object> goodsIds = searchService.getOldGoodsIds(keyword, pageParams);
+		logger.info(String.format("goodsIds\t%s\t%.3fs", keyword, (System.currentTimeMillis() - start) / 1000.0));
+		return goodsIds;
+	}
+
     @RequestMapping("/pcbGoodsIds")
     @ResponseBody
     public Map<String, Object> getPCBGoodsIds(String keyword, String params, HttpServletRequest request) throws IOException {

+ 58 - 1
mall-search/src/main/java/com/uas/search/service/SearchService.java

@@ -265,7 +265,7 @@ public interface SearchService {
 	public List<Map<String, String>> getSimilarPropertyValues(Long kindId, Long propertyId, String keyword, Long topNum);
 
 	/**
-	 * 根据关键词搜索批次(关键词可能是器件、类目、品牌
+	 * 根据关键词搜索批次(关键词是型号
 	 * 
 	 * @param keyword
 	 *            关键词
@@ -321,6 +321,63 @@ public interface SearchService {
 	 */
 	public Map<String, Object> getGoodsIds(String keyword, PageParams pageParams) throws IOException;
 
+	/**
+	 * 根据关键词搜索批次(关键词可能是器件、类目、品牌)
+	 *
+	 * @param keyword
+	 *            关键词
+	 * @param pageParams
+	 *            翻页、过滤、排序等信息
+	 *            <p>
+	 *            关于过滤,通过键值对指定过滤条件,键为
+	 *            {@link com.uas.search.constant.model.PageParams.FilterField}
+	 *            ,值的类型由键决定:
+	 *            </p>
+	 *
+	 *            <table border=1 cellpadding=5 cellspacing=0 summary=
+	 *            "Fields and types">
+	 *            <tr>
+	 *            <th>Field</th>
+	 *            <th>Type</th>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_KINDID</td>
+	 *            <td>List(Long)</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_BRANDID</td>
+	 *            <td>List(Long)</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_STORE_TYPE</td>
+	 *            <td>List(String)</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_CRNAME</td>
+	 *            <td>List(String)</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_MINPRICERMB</td>
+	 *            <td>Double</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_MAXPRICERMB</td>
+	 *            <td>Double</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_MINPRICEUSD</td>
+	 *            <td>Double</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_MAXPRICEUSD</td>
+	 *            <td>Double</td>
+	 *            </tr>
+	 *            </table>
+	 *
+	 * @return 器件id、批次id和分页信息
+	 */
+	public Map<String, Object> getOldGoodsIds(String keyword, PageParams pageParams) throws IOException;
+
     /**
      * 根据关键词搜索 PCB 批次
      *

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

@@ -1184,6 +1184,21 @@ public class SearchServiceImpl implements SearchService {
 		return map;
 	}
 
+	@Override
+	public Map<String, Object> getOldGoodsIds(String keyword, PageParams pageParams) throws IOException {
+		List<String> keywordFields = new ArrayList<>();
+		// 先根据品牌搜索,品牌不存在再搜索型号等
+		keywordFields.add(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD);
+		keywordFields.add(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD);
+		Map<String, Object> goodsIds = getGoodsIds(keyword, keywordFields, false, pageParams);
+		if (CollectionUtils.isEmpty(goodsIds) || goodsIds.get("componentIds") == null
+			|| JSONObject.parseArray(goodsIds.get("componentIds").toString()).isEmpty()) {
+			keyword = recursivelyGetGoodsIds(keyword, null, true);
+			goodsIds = getOldGoodsIds(keyword, null, true, pageParams);
+		}
+		return goodsIds;
+	}
+
 	/**
 	 * 递归查询物料(如果没有结果,则降低精度,直至长度为 1)
 	 *
@@ -1356,6 +1371,78 @@ public class SearchServiceImpl implements SearchService {
 		return map;
 	}
 
+	/**
+	 * @param keyword
+	 * @param keywordFields
+	 *            要查询的字段
+	 * @param tokenized
+	 *            是否分词
+	 * @param pageParams
+	 * @return
+	 */
+	private Map<String, Object> getOldGoodsIds(String keyword, List<String> keywordFields, Boolean tokenized,
+		PageParams pageParams) {
+// 因为器件、属性值的数据量远比类目、品牌大得多,而且器件搜索可能还需进行分页,
+		// 所以涉及器件、属性值的搜索,大都不能像类目和品牌一样直接利用SearchUtils.getDocuments方法
+		IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.GOODS_TABLE_NAME);
+
+		if (pageParams == null) {
+			pageParams = new PageParams();
+		}
+		if (pageParams.getPage() <= 0)
+			pageParams.setPage(1);
+		if (pageParams.getSize() <= 0)
+			pageParams.setSize(20);
+
+		Map<String, Object> map = new HashMap<String, Object>();
+		List<Long> cmpIds = new ArrayList<>();
+		List<Long> goIds = new ArrayList<>();
+		try {
+			BooleanQuery booleanQuery = queryGoods(keyword, keywordFields, tokenized);
+			setGoodsFilter(pageParams.getFilters(), booleanQuery);
+			logger.info(booleanQuery.toString());
+
+			Sort sort = sortGoods(keyword, pageParams.getSort());
+			TopDocs hits;
+			if (pageParams.getPage() > 1) {// 不是第一页
+				TopDocs previousHits = indexSearcher.search(booleanQuery,
+					(pageParams.getPage() - 1) * pageParams.getSize(), sort, true, false);
+				int totalHits = previousHits.totalHits;
+				if ((pageParams.getPage() - 1) * pageParams.getSize() >= totalHits) {
+					return map;
+				}
+				ScoreDoc[] previousScoreDocs = previousHits.scoreDocs;
+				ScoreDoc after = previousScoreDocs[previousScoreDocs.length - 1];
+				hits = indexSearcher.searchAfter(after, booleanQuery, pageParams.getSize(), sort, true, false);
+			} else {
+				hits = indexSearcher.search(booleanQuery, pageParams.getSize(), sort, true, false);
+			}
+
+			// 数据量太大,需要指定将获取的数据(以免载入不必要的数据,降低速度)
+			Set<String> fieldsToLoad = new HashSet<>();
+			fieldsToLoad.add(SearchConstants.GOODS_CMP_ID_FIELD);
+			fieldsToLoad.add(SearchConstants.GOODS_GO_ID_FIELD);
+			ScoreDoc[] scoreDocs = hits.scoreDocs;
+			for (ScoreDoc scoreDoc : scoreDocs) {
+				Document document = indexSearcher.doc(scoreDoc.doc, fieldsToLoad);
+				String cmpId = document.get(SearchConstants.GOODS_CMP_ID_FIELD);
+				cmpIds.add(StringUtils.isEmpty(cmpId) || cmpId.equals(ObjectToDocumentUtils.NULL_VALUE) ? null : Long.valueOf(cmpId));
+				String goId = document.get(SearchConstants.GOODS_GO_ID_FIELD);
+				goIds.add(StringUtils.isEmpty(goId) || goId.equals(ObjectToDocumentUtils.NULL_VALUE) ? null : Long.valueOf(goId));
+			}
+			map.put("componentIds", cmpIds);
+			map.put("goodsIds", goIds);
+			map.put("page", pageParams.getPage());
+			map.put("size", pageParams.getSize());
+			map.put("total", hits.totalHits);
+		} catch (IOException e) {
+			logger.error("", e);
+		} finally {
+			SearchUtils.releaseIndexSearcher(indexSearcher);
+		}
+		return map;
+	}
+
 	/**
 	 * 获取物料信息
 	 * @param keyword