|
@@ -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
|