|
@@ -1,5 +1,6 @@
|
|
|
package com.uas.search.service.impl;
|
|
|
|
|
|
+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;
|
|
|
import static com.uas.search.util.SearchUtils.getDocuments;
|
|
@@ -222,7 +223,7 @@ public class SearchServiceImpl implements SearchService {
|
|
|
List<String> keywordFields = null;
|
|
|
// 若未指定,再获取实体类中所配置的
|
|
|
if (pageParams != null && !CollectionUtils.isEmpty(pageParams.getKeywordSearchColumns())) {
|
|
|
- keywordFields = getKeywordFields(tableName, pageParams.getKeywordSearchColumns());
|
|
|
+ keywordFields = getKeywordFields(pageParams.getKeywordSearchColumns());
|
|
|
} else {
|
|
|
keywordFields = ClassAndTableNameUtils.getKeywordFields(tableName);
|
|
|
}
|
|
@@ -510,18 +511,15 @@ public class SearchServiceImpl implements SearchService {
|
|
|
|
|
|
/**
|
|
|
* 获取指定的可以搜索的字段列名
|
|
|
- *
|
|
|
- * @param tableName
|
|
|
- * 单据类型
|
|
|
* @param keywordSearchColumns
|
|
|
* keyword模糊搜索的字段名称
|
|
|
* @return 可以搜索的字段列名
|
|
|
*/
|
|
|
- private List<String> getKeywordFields(Table_name tableName, List<String> keywordSearchColumns) {
|
|
|
+ private List<String> getKeywordFields(List<String> keywordSearchColumns) {
|
|
|
List<String> result = new ArrayList<>();
|
|
|
for (String keywordSearchColumn : keywordSearchColumns) {
|
|
|
// 返回之前先拼接索引域名
|
|
|
- result.add(ClassAndTableNameUtils.combineField(tableName, keywordSearchColumn));
|
|
|
+ result.add(keywordSearchColumn);
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
@@ -1414,7 +1412,69 @@ public class SearchServiceImpl implements SearchService {
|
|
|
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
+ @Override
|
|
|
+ public Set<Map<String, Object>> getSimilarGoods(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();
|
|
|
+ if (!StringUtils.isEmpty(storeType)) {
|
|
|
+ storeTypes = Arrays.asList(storeType.split(","));
|
|
|
+ }
|
|
|
+ if (!CollectionUtils.isEmpty(storeTypes)) {
|
|
|
+ filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQuery);
|
|
|
+ }
|
|
|
+// String termCode = "";
|
|
|
+ DistinctGroupCollector.CollectField[] collectFields = new DistinctGroupCollector.CollectField[] {
|
|
|
+ new DistinctGroupCollector.CollectField(SearchConstants.GOODS_PR_PCMPCODE_FIELD, SearchConstants.GOODS_PR_PCMPCODE_FIELD)
|
|
|
+ };
|
|
|
+ DistinctGroupCollector collector = new DistinctGroupCollector(SearchConstants.GOODS_PR_PCMPCODE_FIELD, collectFields);
|
|
|
+ booleanQuery.add(new TermQuery(new Term(GOODS_PR_PCMPCODE_FIELD, keyword.toLowerCase())), BooleanClause.Occur.MUST);
|
|
|
+ indexSearcher.search(booleanQuery, collector);
|
|
|
+ goods.addAll(collector.getCollectValues());
|
|
|
+
|
|
|
+ BooleanQuery booleanQueryPre = new BooleanQuery();
|
|
|
+ if (!CollectionUtils.isEmpty(storeTypes)) {
|
|
|
+ filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQueryPre);
|
|
|
+ }
|
|
|
+ booleanQueryPre.add(new PrefixQuery(new Term(GOODS_PR_PCMPCODE_FIELD, keyword.toLowerCase())), Occur.MUST);
|
|
|
+ logger.info(booleanQueryPre.toString());
|
|
|
+// Sort sort = new Sort(new SortField(GOODS_PR_PCMPCODE_FIELD, new StringFieldComparatorSource(keyword, true)));
|
|
|
+ indexSearcher.search(booleanQueryPre, collector);
|
|
|
+ goods.addAll(collector.getCollectValues());
|
|
|
+// TopDocs hits = indexSearcher.search(booleanQueryPre, size * 2, sort, true, false);
|
|
|
+// ScoreDoc[] scoreDocs = hits.scoreDocs;
|
|
|
+// String pcmpcode = "";
|
|
|
+// for (ScoreDoc scoreDoc : scoreDocs) {
|
|
|
+// Set<String> fieldsToLoad = new HashSet<>();
|
|
|
+// fieldsToLoad.add(SearchConstants.GOODS_GO_ID_FIELD);
|
|
|
+// fieldsToLoad.add(SearchConstants.GOODS_ST_TYPE_FIELD);
|
|
|
+// fieldsToLoad.add(GOODS_PR_PCMPCODE_FIELD);
|
|
|
+// Document document = indexSearcher.doc(scoreDoc.doc, fieldsToLoad);
|
|
|
+// Map<String, Object> map = new HashMap<>();
|
|
|
+// map.put("id", Long.parseLong(document.get(SearchConstants.GOODS_GO_ID_FIELD)));
|
|
|
+// map.put("type", document.get(SearchConstants.GOODS_ST_TYPE_FIELD));
|
|
|
+// map.put("pcmpcode", document.get(GOODS_PR_PCMPCODE_FIELD));
|
|
|
+// if (!pcmpcode.equals(map.get("pcmpcode")) && !termCode.equals(map.get("pcmpcode"))) {
|
|
|
+// goods.add(map);
|
|
|
+// pcmpcode = String.valueOf(map.get("pcmpcode"));
|
|
|
+// }
|
|
|
+// }
|
|
|
+ } catch (IOException e) {
|
|
|
+ logger.error("", e);
|
|
|
+ } finally {
|
|
|
+ releaseIndexSearcher(indexSearcher);
|
|
|
+ }
|
|
|
+ return goods;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 根据输入获取相似的器件原厂型号
|
|
|
*
|
|
|
* @param componentCode
|
|
@@ -1560,7 +1620,7 @@ public class SearchServiceImpl implements SearchService {
|
|
|
List<String> goodsFields = new ArrayList<>();
|
|
|
List<String> productsFields = new ArrayList<>();
|
|
|
// 先根据品牌搜索,品牌不存在再搜索型号等
|
|
|
- goodsFields.add(SearchConstants.GOODS_PR_PCMPCODE_FIELD);
|
|
|
+ goodsFields.add(GOODS_PR_PCMPCODE_FIELD);
|
|
|
goodsFields.add(SearchConstants.GOODS_CMP_CODE_FIELD);
|
|
|
|
|
|
productsFields.add(SearchConstants.PRODUCT_PRIVATE_CMPCODE_FIELD);
|
|
@@ -2061,7 +2121,7 @@ public class SearchServiceImpl implements SearchService {
|
|
|
sortFieldList.addAll(Arrays.asList(
|
|
|
// 如果仍然无法得到正确结果,就根据按照型号等顺序严格排列
|
|
|
// new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword, false)),
|
|
|
- new SortField(SearchConstants.GOODS_PR_PCMPCODE_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(SearchConstants.GOODS_PR_KIND_FIELD, new StringFieldComparatorSource(keyword, false)),
|
|
@@ -2628,11 +2688,11 @@ public class SearchServiceImpl implements SearchService {
|
|
|
BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
// 前缀搜索(字段并未分词,进行分词搜索时,会有边界问题,如搜索 'BC807-40,215')
|
|
|
booleanQuery.add(new PrefixQuery(new Term(SearchConstants.GOODS_CMP_CODE_FIELD, keyword.toLowerCase())), BooleanClause.Occur.SHOULD);
|
|
|
- booleanQuery.add(new PrefixQuery(new Term(SearchConstants.GOODS_PR_PCMPCODE_FIELD, keyword.toLowerCase())), BooleanClause.Occur.SHOULD);
|
|
|
+ booleanQuery.add(new PrefixQuery(new Term(GOODS_PR_PCMPCODE_FIELD, keyword.toLowerCase())), BooleanClause.Occur.SHOULD);
|
|
|
// 原厂型号
|
|
|
booleanQuery.add(createQuery(SearchConstants.GOODS_CMP_CODE_FIELD, keyword, 100), BooleanClause.Occur.SHOULD);
|
|
|
// 非标
|
|
|
- booleanQuery.add(createQuery(SearchConstants.GOODS_PR_PCMPCODE_FIELD, keyword, 100), Occur.SHOULD);
|
|
|
+ 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);
|