|
|
@@ -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<>();
|