Browse Source

don't consider filters when getting goods recursively

sunyj 8 năm trước cách đây
mục cha
commit
89a9c7e743

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

@@ -205,14 +205,14 @@ public class SearchController {
 
 	@RequestMapping("/goodsIds")
 	@ResponseBody
-	public Map<String, Object> getGoodsIds(String keyword, String params, HttpServletRequest request) {
+	public Map<String, Object> getGoodsIds(String keyword, String params, HttpServletRequest request) throws IOException {
 		PageParams pageParams = params==null?null:JSONObject.parseObject(params, PageParams.class);
 		return searchService.getGoodsIds(keyword, pageParams);
 	}
 
 	@RequestMapping("/collectBySearchGoods")
 	@ResponseBody
-	public List<Map<String, Object>> collectBySearchGoods(String keyword, @RequestParam String collectedField, String filters, HttpServletRequest request) {
+	public List<Map<String, Object>> collectBySearchGoods(String keyword, @RequestParam String collectedField, String filters, HttpServletRequest request) throws IOException {
         Map<FilterField, Object> filtersMap = new HashMap<>();
         if(!StringUtils.isEmpty(filters)){
             JSONObject json = JSONObject.parseObject(filters);

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

@@ -293,7 +293,7 @@ public interface SearchService {
 	 * 
 	 * @return 器件id、批次id和分页信息
 	 */
-	public Map<String, Object> getGoodsIds(String keyword, PageParams pageParams) ;
+	public Map<String, Object> getGoodsIds(String keyword, PageParams pageParams) throws IOException;
 
 	/**
 	 * 搜索批次时,统计指定信息
@@ -356,7 +356,7 @@ public interface SearchService {
 	 *         </table>
 	 */
 	public List<Map<String, Object>> collectBySearchGoods(String keyword, CollectField collectedField,
-			Map<FilterField, Object> filters);
+			Map<FilterField, Object> filters) throws IOException;
 
 	/**
 	 * 根据id获取类目

+ 35 - 27
mall-search/src/main/java/com/uas/search/service/impl/SearchServiceImpl.java

@@ -816,15 +816,16 @@ public class SearchServiceImpl implements SearchService {
 	}
 
 	@Override
-	public Map<String, Object> getGoodsIds(String keyword, PageParams pageParams) {
+	public Map<String, Object> getGoodsIds(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, false);
+		Map<String, Object> goodsIds = getGoodsIds(keyword, keywordFields, false, pageParams);
 		if (CollectionUtils.isEmpty(goodsIds) || goodsIds.get("componentIds") == null
 				|| JSONObject.parseArray(goodsIds.get("componentIds").toString()).isEmpty()) {
-			goodsIds = getGoodsIds(keyword, null, true, pageParams, true);
+            keyword = recursivelyGetGoodsIds(keyword, null, true);
+			goodsIds = getGoodsIds(keyword, null, true, pageParams);
 		}
 		return goodsIds;
 	}
@@ -836,11 +837,10 @@ public class SearchServiceImpl implements SearchService {
 	 * @param tokenized
 	 *            是否分词
 	 * @param pageParams
-	 * @param recursivelyGet 是否递归获取(逐步降低精度,直到只匹配一个字符)
 	 * @return
 	 */
 	private Map<String, Object> getGoodsIds(String keyword, List<String> keywordFields, Boolean tokenized,
-			PageParams pageParams, Boolean recursivelyGet) {
+			PageParams pageParams) {
 		// 因为器件、属性值的数据量远比类目、品牌大得多,而且器件搜索可能还需进行分页,
 		// 所以涉及器件、属性值的搜索,大都不能像类目和品牌一样直接利用SearchUtils.getDocuments方法
 		IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.GOODS_TABLE_NAME);
@@ -868,10 +868,6 @@ public class SearchServiceImpl implements SearchService {
 						(pageParams.getPage() - 1) * pageParams.getSize(), sort, true, false);
 				int totalHits = previousHits.totalHits;
 				if ((pageParams.getPage() - 1) * pageParams.getSize() >= totalHits) {
-                    // 如果没有结果,则降低精度,直至 keyword 长度为 1
-                    if(recursivelyGet && totalHits < 1 && !SearchUtils.isKeywordInvalid(keyword) && keyword.length() > 1){
-                        return getGoodsIds(keyword.substring(0, keyword.length() - 1), keywordFields, tokenized, pageParams, recursivelyGet);
-                    }
 					return map;
 				}
 				ScoreDoc[] previousScoreDocs = previousHits.scoreDocs;
@@ -881,10 +877,6 @@ public class SearchServiceImpl implements SearchService {
 				hits = indexSearcher.search(booleanQuery, pageParams.getSize(), sort, true, false);
 			}
 
-			// 如果没有结果,则降低精度,直至 keyword 长度为 1
-			if(recursivelyGet && hits.totalHits < 1 && !SearchUtils.isKeywordInvalid(keyword) && keyword.length() > 1){
-				return getGoodsIds(keyword.substring(0, keyword.length() - 1), keywordFields, tokenized, pageParams, recursivelyGet);
-			}
 			// 数据量太大,需要指定将获取的数据(以免载入不必要的数据,降低速度)
 			Set<String> fieldsToLoad = new HashSet<>();
 			fieldsToLoad.add(SearchConstants.GOODS_CMP_ID_FIELD);
@@ -926,6 +918,31 @@ public class SearchServiceImpl implements SearchService {
 		return map;
 	}
 
+    /**
+     * 递归查询批次(如果没有结果,则降低精度,直至长度为 1)
+     *
+     * @param keyword       关键词
+     * @param keywordFields 要查询的字段
+     * @param tokenized     是否分词
+     * @return 最后一次搜索的关键词
+     */
+    private String recursivelyGetGoodsIds(String keyword, List<String> keywordFields, Boolean tokenized) throws IOException {
+        IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.GOODS_TABLE_NAME);
+        try {
+            BooleanQuery booleanQuery = queryGoods(keyword, keywordFields, tokenized);
+            logger.info(booleanQuery.toString());
+            TotalHitCountCollector collector = new TotalHitCountCollector();
+            indexSearcher.search(booleanQuery, collector);
+            // 如果没有结果,则降低精度,直至 keyword 长度为 1
+            if (collector.getTotalHits() < 1 && !SearchUtils.isKeywordInvalid(keyword) && keyword.length() > 1) {
+                return recursivelyGetGoodsIds(keyword.substring(0, keyword.length() - 1), keywordFields, tokenized);
+            }
+            return keyword;
+        } finally {
+            SearchUtils.releaseIndexSearcher(indexSearcher);
+        }
+    }
+
     /**
      * 设置批次过滤条件
      *
@@ -1070,14 +1087,15 @@ public class SearchServiceImpl implements SearchService {
 
 	@Override
 	public List<Map<String, Object>> collectBySearchGoods(String keyword, CollectField collectedField,
-			Map<FilterField, Object> filters) {
+			Map<FilterField, Object> filters) 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);
-		List<Map<String, Object>> result = collectBySearchGoods(keyword, keywordFields, false, collectedField, filters, false);
+		List<Map<String, Object>> result = collectBySearchGoods(keyword, keywordFields, false, collectedField, filters);
 		if (CollectionUtils.isEmpty(result)) {
-			result = collectBySearchGoods(keyword, null, true, collectedField, filters, true);
+            keyword = recursivelyGetGoodsIds(keyword, null, true);
+			result = collectBySearchGoods(keyword, null, true, collectedField, filters);
 		}
 		return result;
 
@@ -1091,23 +1109,13 @@ public class SearchServiceImpl implements SearchService {
 	 *            是否分词
 	 * @param collectedField
 	 * @param filters
-	 * @param recursivelyGet 是否递归获取(逐步降低精度,直到只匹配一个字符)
 	 * @return
 	 */
 	private List<Map<String, Object>> collectBySearchGoods(String keyword, List<String> keywordFields,
-			Boolean tokenized, CollectField collectedField, Map<FilterField, Object> filters, Boolean recursivelyGet) {
+			Boolean tokenized, CollectField collectedField, Map<FilterField, Object> filters) {
 		if (collectedField == null && CollectionUtils.isEmpty(filters)) {
 			throw new IllegalArgumentException("参数不合法:collectedField=" + collectedField + ", filter=" + filters);
 		}
-		// 与批次搜索的搜索词保持一致,最终有结果的 keyword 是相同的
-		if(recursivelyGet != null && recursivelyGet){
-			PageParams pageParams = new PageParams();
-			pageParams.setFilters(filters);
-			Map<String, Object> goodsIds = getGoodsIds(keyword, keywordFields, tokenized, pageParams, false);
-			if(Integer.parseInt(goodsIds.get("total").toString()) < 1 && !SearchUtils.isKeywordInvalid(keyword) && keyword.length() > 1){
-				return collectBySearchGoods(keyword.substring(0, keyword.length() - 1), keywordFields, tokenized, collectedField, filters, true);
-			}
-		}
 		IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.GOODS_TABLE_NAME);
 
 		List<Map<String, Object>> result = new ArrayList<>();