|
|
@@ -1,5 +1,11 @@
|
|
|
package com.uas.search.service.impl;
|
|
|
|
|
|
+import static com.uas.search.constant.SearchConstants.GOODS_BR_NAME_CN_FIELD;
|
|
|
+import static com.uas.search.constant.SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD;
|
|
|
+import static com.uas.search.constant.SearchConstants.GOODS_BR_NAME_EN_FIELD;
|
|
|
+import static com.uas.search.constant.SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD;
|
|
|
+import static com.uas.search.constant.SearchConstants.GOODS_KI_NAME_CN_FIELD;
|
|
|
+import static com.uas.search.constant.SearchConstants.GOODS_KI_NAME_CN_UNTOKENIZED_FIELD;
|
|
|
import static com.uas.search.constant.SearchConstants.GOODS_PR_PCMPCODE_FIELD;
|
|
|
import static com.uas.search.constant.model.Sort.Field.PRICE;
|
|
|
import static com.uas.search.constant.model.Sort.Field.RESERVE;
|
|
|
@@ -1413,7 +1419,7 @@ public class SearchServiceImpl implements SearchService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public Set<Map<String, Object>> getSimilarGoods(String keyword, String storeType, Integer size) throws IOException {
|
|
|
+ public Set<Map<String, Object>> getSimilarGoodsCode(String keyword, String storeType, Integer size) throws IOException {
|
|
|
size = size == null || size < 1 ? SIMILAR_NUM : size;
|
|
|
if (SearchUtils.isKeywordInvalid(keyword)) {
|
|
|
throw new IllegalArgumentException("输入无效:" + keyword);
|
|
|
@@ -1424,6 +1430,9 @@ public class SearchServiceImpl implements SearchService {
|
|
|
try {
|
|
|
List<String> storeTypes = new ArrayList<>();
|
|
|
BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
+ List<Long> status = Arrays.asList(TradeGoods.VALID_STATUS);
|
|
|
+ filter(status, SearchConstants.GOODS_GO_STATUS_FIELD, booleanQuery);
|
|
|
+
|
|
|
if (!StringUtils.isEmpty(storeType)) {
|
|
|
storeTypes = Arrays.asList(storeType.split(","));
|
|
|
}
|
|
|
@@ -1439,6 +1448,7 @@ public class SearchServiceImpl implements SearchService {
|
|
|
goods.addAll(collector.getCollectValues());
|
|
|
|
|
|
BooleanQuery booleanQueryPre = new BooleanQuery();
|
|
|
+ filter(status, SearchConstants.GOODS_GO_STATUS_FIELD, booleanQueryPre);
|
|
|
if (!CollectionUtils.isEmpty(storeTypes)) {
|
|
|
filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQueryPre);
|
|
|
}
|
|
|
@@ -1454,6 +1464,111 @@ public class SearchServiceImpl implements SearchService {
|
|
|
return goods;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public Set<Map<String, Object>> getSimilarGoodsBrand(String keyword, String storeType, Integer size)
|
|
|
+ throws IOException {
|
|
|
+ size = size == null || size < 1 ? SIMILAR_NUM : size;
|
|
|
+ if (SearchUtils.isKeywordInvalid(keyword)) {
|
|
|
+ throw new IllegalArgumentException("输入无效:" + keyword);
|
|
|
+ }
|
|
|
+ IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.GOODS_TABLE_NAME);
|
|
|
+
|
|
|
+ Set<Map<String, Object>> goods = new HashSet<>();
|
|
|
+ try {
|
|
|
+ List<String> storeTypes = new ArrayList<>();
|
|
|
+ BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
+ List<Long> status = Arrays.asList(TradeGoods.VALID_STATUS);
|
|
|
+ filter(status, SearchConstants.GOODS_GO_STATUS_FIELD, booleanQuery);
|
|
|
+
|
|
|
+ if (!StringUtils.isEmpty(storeType)) {
|
|
|
+ storeTypes = Arrays.asList(storeType.split(","));
|
|
|
+ }
|
|
|
+ if (!CollectionUtils.isEmpty(storeTypes)) {
|
|
|
+ filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQuery);
|
|
|
+ }
|
|
|
+ DistinctGroupCollector.CollectField[] collectFields = new DistinctGroupCollector.CollectField[] {
|
|
|
+ new DistinctGroupCollector.CollectField(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, GOODS_BR_NAME_EN_UNTOKENIZED_FIELD)
|
|
|
+ };
|
|
|
+ DistinctGroupCollector collector = new DistinctGroupCollector(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, collectFields);
|
|
|
+ booleanQuery.add(new TermQuery(new Term(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, keyword.toLowerCase())), Occur.MUST);
|
|
|
+ indexSearcher.search(booleanQuery, collector);
|
|
|
+ goods.addAll(collector.getCollectValues());
|
|
|
+
|
|
|
+ BooleanQuery booleanQueryPre = new BooleanQuery();
|
|
|
+ filter(status, SearchConstants.GOODS_GO_STATUS_FIELD, booleanQueryPre);
|
|
|
+ if (!CollectionUtils.isEmpty(storeTypes)) {
|
|
|
+ filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQueryPre);
|
|
|
+ }
|
|
|
+ booleanQueryPre.add(new PrefixQuery(new Term(GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, keyword.toLowerCase())), Occur.MUST);
|
|
|
+ booleanQueryPre.add(new PrefixQuery(new Term(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, keyword.toLowerCase())), Occur.MUST);
|
|
|
+ logger.info(booleanQueryPre.toString());
|
|
|
+ indexSearcher.search(booleanQueryPre, collector);
|
|
|
+ goods.addAll(collector.getCollectValues());
|
|
|
+
|
|
|
+// BooleanQuery booleanQueryPre = new BooleanQuery();
|
|
|
+// if (!CollectionUtils.isEmpty(storeTypes)) {
|
|
|
+// filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQueryPre);
|
|
|
+// }
|
|
|
+// booleanQueryPre.add(SearchUtils.getBooleanQuery(SearchConstants.GOODS_BR_NAME_CN_FIELD, keyword.toLowerCase()), Occur.SHOULD);
|
|
|
+// booleanQueryPre.add(SearchUtils.getBooleanQuery(SearchConstants.GOODS_BR_NAME_EN_FIELD, keyword.toLowerCase()), Occur.SHOULD);
|
|
|
+// logger.info(booleanQueryPre.toString());
|
|
|
+// indexSearcher.search(booleanQueryPre, collector);
|
|
|
+// goods.addAll(collector.getCollectValues());
|
|
|
+ } catch (IOException e) {
|
|
|
+ logger.error("", e);
|
|
|
+ } finally {
|
|
|
+ releaseIndexSearcher(indexSearcher);
|
|
|
+ }
|
|
|
+ return goods;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Set<Map<String, Object>> getSimilarGoodsKind(String keyword, String storeType, Integer size)
|
|
|
+ throws IOException {
|
|
|
+ size = size == null || size < 1 ? SIMILAR_NUM : size;
|
|
|
+ if (SearchUtils.isKeywordInvalid(keyword)) {
|
|
|
+ throw new IllegalArgumentException("输入无效:" + keyword);
|
|
|
+ }
|
|
|
+ IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.GOODS_TABLE_NAME);
|
|
|
+
|
|
|
+ Set<Map<String, Object>> goods = new HashSet<>();
|
|
|
+ try {
|
|
|
+ List<String> storeTypes = new ArrayList<>();
|
|
|
+ BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
+ List<Long> status = Arrays.asList(TradeGoods.VALID_STATUS);
|
|
|
+ filter(status, SearchConstants.GOODS_GO_STATUS_FIELD, booleanQuery);
|
|
|
+
|
|
|
+ if (!StringUtils.isEmpty(storeType)) {
|
|
|
+ storeTypes = Arrays.asList(storeType.split(","));
|
|
|
+ }
|
|
|
+ if (!CollectionUtils.isEmpty(storeTypes)) {
|
|
|
+ filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQuery);
|
|
|
+ }
|
|
|
+ DistinctGroupCollector.CollectField[] collectFields = new DistinctGroupCollector.CollectField[] {
|
|
|
+ new DistinctGroupCollector.CollectField(GOODS_KI_NAME_CN_FIELD, GOODS_KI_NAME_CN_FIELD),
|
|
|
+ };
|
|
|
+ DistinctGroupCollector collector = new DistinctGroupCollector(GOODS_KI_NAME_CN_FIELD, collectFields);
|
|
|
+ booleanQuery.add(new TermQuery(new Term(GOODS_KI_NAME_CN_UNTOKENIZED_FIELD, keyword.toLowerCase())), BooleanClause.Occur.MUST);
|
|
|
+ indexSearcher.search(booleanQuery, collector);
|
|
|
+ goods.addAll(collector.getCollectValues());
|
|
|
+
|
|
|
+ BooleanQuery booleanQueryPre = new BooleanQuery();
|
|
|
+ filter(status, SearchConstants.GOODS_GO_STATUS_FIELD, booleanQueryPre);
|
|
|
+ if (!CollectionUtils.isEmpty(storeTypes)) {
|
|
|
+ filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQueryPre);
|
|
|
+ }
|
|
|
+ booleanQueryPre.add(new PrefixQuery(new Term(GOODS_KI_NAME_CN_FIELD, keyword.toLowerCase())), Occur.MUST);
|
|
|
+ logger.info(booleanQueryPre.toString());
|
|
|
+ indexSearcher.search(booleanQueryPre, collector);
|
|
|
+ goods.addAll(collector.getCollectValues());
|
|
|
+ } catch (IOException e) {
|
|
|
+ logger.error("", e);
|
|
|
+ } finally {
|
|
|
+ releaseIndexSearcher(indexSearcher);
|
|
|
+ }
|
|
|
+ return goods;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 根据输入获取相似的器件原厂型号
|
|
|
*
|
|
|
@@ -1632,8 +1747,8 @@ public class SearchServiceImpl implements SearchService {
|
|
|
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);
|
|
|
+ keywordFields.add(GOODS_BR_NAME_CN_UNTOKENIZED_FIELD);
|
|
|
+ keywordFields.add(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD);
|
|
|
Map<String, Object> goodsIds = getOldGoodsIds(keyword, keywordFields, false, pageParams);
|
|
|
if (CollectionUtils.isEmpty(goodsIds) || goodsIds.get("componentIds") == null
|
|
|
|| JSONObject.parseArray(goodsIds.get("componentIds").toString()).isEmpty()) {
|
|
|
@@ -2102,8 +2217,8 @@ public class SearchServiceImpl implements SearchService {
|
|
|
// 如果仍然无法得到正确结果,就根据按照型号等顺序严格排列
|
|
|
// new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword, false)),
|
|
|
new SortField(GOODS_PR_PCMPCODE_FIELD, new StringFieldComparatorSource(keyword, false)),
|
|
|
- new SortField(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, false)),
|
|
|
- new SortField(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, false)),
|
|
|
+ new SortField(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, false)),
|
|
|
+ new SortField(GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, false)),
|
|
|
new SortField(SearchConstants.GOODS_PR_KIND_FIELD, new StringFieldComparatorSource(keyword, false)),
|
|
|
new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword, false)),
|
|
|
// new SortField(SearchConstants.GOODS_KI_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword, false)),
|
|
|
@@ -2344,8 +2459,8 @@ public class SearchServiceImpl implements SearchService {
|
|
|
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);
|
|
|
+ keywordFields.add(GOODS_BR_NAME_CN_UNTOKENIZED_FIELD);
|
|
|
+ keywordFields.add(GOODS_BR_NAME_EN_UNTOKENIZED_FIELD);
|
|
|
List<Map<String, Object>> result = collectBySearchGoods(keyword, keywordFields, false, collectedField, filters);
|
|
|
if (CollectionUtils.isEmpty(result)) {
|
|
|
keyword = recursivelyGetGoodsIds(keyword, null, true);
|
|
|
@@ -2575,14 +2690,14 @@ public class SearchServiceImpl implements SearchService {
|
|
|
case GOODS_KIND:
|
|
|
uniqueField = SearchConstants.GOODS_KI_ID_FIELD;
|
|
|
fieldsToLoad.add(SearchConstants.GOODS_KI_ID_FIELD);
|
|
|
- fieldsToLoad.add(SearchConstants.GOODS_KI_NAME_CN_FIELD);
|
|
|
+ fieldsToLoad.add(GOODS_KI_NAME_CN_FIELD);
|
|
|
break;
|
|
|
case GOODS_BRAND:
|
|
|
uniqueField = SearchConstants.GOODS_BR_ID_FIELD;
|
|
|
fieldsToLoad.add(SearchConstants.GOODS_BR_ID_FIELD);
|
|
|
fieldsToLoad.add(SearchConstants.GOODS_BR_UUID_FIELD);
|
|
|
- fieldsToLoad.add(SearchConstants.GOODS_BR_NAME_CN_FIELD);
|
|
|
- fieldsToLoad.add(SearchConstants.GOODS_BR_NAME_EN_FIELD);
|
|
|
+ fieldsToLoad.add(GOODS_BR_NAME_CN_FIELD);
|
|
|
+ fieldsToLoad.add(GOODS_BR_NAME_EN_FIELD);
|
|
|
break;
|
|
|
case GOODS_STORE_TYPE:
|
|
|
uniqueField = SearchConstants.GOODS_ST_TYPE_FIELD;
|
|
|
@@ -2674,10 +2789,10 @@ public class SearchServiceImpl implements SearchService {
|
|
|
// 非标
|
|
|
booleanQuery.add(createQuery(GOODS_PR_PCMPCODE_FIELD, keyword, 100), Occur.SHOULD);
|
|
|
// 品牌
|
|
|
- booleanQuery.add(createQuery(SearchConstants.GOODS_BR_NAME_CN_FIELD, keyword, 10), BooleanClause.Occur.SHOULD);
|
|
|
- booleanQuery.add(createQuery(SearchConstants.GOODS_BR_NAME_EN_FIELD, keyword, 10), BooleanClause.Occur.SHOULD);
|
|
|
+ booleanQuery.add(createQuery(GOODS_BR_NAME_CN_FIELD, keyword, 10), BooleanClause.Occur.SHOULD);
|
|
|
+ booleanQuery.add(createQuery(GOODS_BR_NAME_EN_FIELD, keyword, 10), BooleanClause.Occur.SHOULD);
|
|
|
// 类目
|
|
|
- booleanQuery.add(createQuery(SearchConstants.GOODS_KI_NAME_CN_FIELD, keyword, 1), BooleanClause.Occur.SHOULD);
|
|
|
+ booleanQuery.add(createQuery(GOODS_KI_NAME_CN_FIELD, keyword, 1), BooleanClause.Occur.SHOULD);
|
|
|
// 属性值
|
|
|
booleanQuery.add(createQuery(SearchConstants.GOODS_CMP_DESCRIPTION_FIELD, keyword, 1), BooleanClause.Occur.SHOULD);
|
|
|
return booleanQuery;
|