|
|
@@ -797,7 +797,65 @@ public class SearchServiceImpl implements SearchService {
|
|
|
return components;
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
+ @Override
|
|
|
+ public List<Map<String, Object>> getSimilarProducts(String code, Integer size) {
|
|
|
+ size = size == null || size < 1 ? SIMILAR_NUM : size;
|
|
|
+ if (SearchUtils.isKeywordInvalid(code)) {
|
|
|
+ throw new IllegalArgumentException("输入无效:" + code);
|
|
|
+ }
|
|
|
+ IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.PRODUCTS_PRIVATE_TABLE_NAME);
|
|
|
+
|
|
|
+ List<Map<String, Object>> products = new ArrayList<>();
|
|
|
+ try {
|
|
|
+ String termCode = "";
|
|
|
+ TermQuery termQuery = new TermQuery(new Term(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD, code.toLowerCase()));
|
|
|
+ TopDocs termHits = indexSearcher.search(termQuery, 1);
|
|
|
+
|
|
|
+ if (termHits.totalHits > 0) {
|
|
|
+ for (ScoreDoc scoreDoc : termHits.scoreDocs) {
|
|
|
+ Set<String> fieldsToLoad = new HashSet<>();
|
|
|
+ fieldsToLoad.add(SearchConstants.PRODUCT_PRIVATE_ID_FIELD);
|
|
|
+ fieldsToLoad.add(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD);
|
|
|
+ Document document = indexSearcher.doc(scoreDoc.doc, fieldsToLoad);
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("id", Long.parseLong(document.get(SearchConstants.PRODUCT_PRIVATE_ID_FIELD)));
|
|
|
+ map.put("pcmpcode", document.get(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD));
|
|
|
+ termCode = String.valueOf(map.get("pcmpcode"));
|
|
|
+ products.add(map);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ PrefixQuery prefixQuery = new PrefixQuery(
|
|
|
+ new Term(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD, code.toLowerCase()));
|
|
|
+ logger.info(prefixQuery.toString());
|
|
|
+ // 物料型号重复率过高,故先去重
|
|
|
+ DuplicateFilter codeFilter = new DuplicateFilter(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD);
|
|
|
+ Sort sort = new Sort(new SortField(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD, new StringFieldComparatorSource(code, true)));
|
|
|
+ TopDocs hits = indexSearcher.search(prefixQuery, codeFilter, size * 2, sort, true, false);
|
|
|
+ ScoreDoc[] scoreDocs = hits.scoreDocs;
|
|
|
+ String pcmpcode = "";
|
|
|
+ for (ScoreDoc scoreDoc : scoreDocs) {
|
|
|
+ Set<String> fieldsToLoad = new HashSet<>();
|
|
|
+ fieldsToLoad.add(SearchConstants.PRODUCT_PRIVATE_ID_FIELD);
|
|
|
+ fieldsToLoad.add(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD);
|
|
|
+ Document document = indexSearcher.doc(scoreDoc.doc, fieldsToLoad);
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("id", Long.parseLong(document.get(SearchConstants.PRODUCT_PRIVATE_ID_FIELD)));
|
|
|
+ map.put("pcmpcode", document.get(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD));
|
|
|
+ if (!pcmpcode.equals(map.get("pcmpcode")) && !termCode.equals(map.get("pcmpcode"))) {
|
|
|
+ products.add(map);
|
|
|
+ pcmpcode = String.valueOf(map.get("pcmpcode"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ logger.error("", e);
|
|
|
+ } finally {
|
|
|
+ releaseIndexSearcher(indexSearcher);
|
|
|
+ }
|
|
|
+ return products;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
public List<Map<String, Object>> getSimilarBrands(String brandName, Integer size) throws IOException {
|
|
|
size = size == null || size < 1 ? SIMILAR_NUM : size;
|
|
|
if (SearchUtils.isKeywordInvalid(brandName)) {
|