|
|
@@ -34,6 +34,7 @@ import com.alibaba.fastjson.JSONObject;
|
|
|
import com.uas.search.console.core.util.FastjsonUtils;
|
|
|
import com.uas.search.console.model.BrandSimpleInfo;
|
|
|
import com.uas.search.console.model.ComponentSimpleInfo;
|
|
|
+import com.uas.search.console.model.GoodsSimpleInfo;
|
|
|
import com.uas.search.console.model.KindSimpleInfo;
|
|
|
import com.uas.search.console.service.InnerSearchService;
|
|
|
import com.uas.search.console.util.DocumentToObjectUtils;
|
|
|
@@ -42,6 +43,8 @@ import com.uas.search.console.util.SearchUtils;
|
|
|
import com.uas.search.exception.SearchException;
|
|
|
import com.uas.search.grouping.DistinctGroupCollector;
|
|
|
import com.uas.search.model.PageParams;
|
|
|
+import com.uas.search.model.SPage;
|
|
|
+import com.uas.search.model.PageParams.FilterField;
|
|
|
import com.uas.search.service.SearchService;
|
|
|
import com.uas.search.sort.SimilarValuesFieldComparatorSource;
|
|
|
|
|
|
@@ -194,9 +197,9 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
if (pageParams == null) {
|
|
|
pageParams = new PageParams();
|
|
|
}
|
|
|
- if (pageParams.getPage() == 0)
|
|
|
+ if (pageParams.getPage() <= 0)
|
|
|
pageParams.setPage(1);
|
|
|
- if (pageParams.getSize() == 0)
|
|
|
+ if (pageParams.getSize() <= 0)
|
|
|
pageParams.setSize(20);
|
|
|
|
|
|
Map<String, Object> map = new HashMap<String, Object>();
|
|
|
@@ -207,26 +210,25 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
booleanQuery.add(setBoost(keyword), BooleanClause.Occur.MUST);
|
|
|
}
|
|
|
|
|
|
- Map<String, Object> filters = pageParams.getFilters();
|
|
|
+ Map<FilterField, Object> filters = pageParams.getFilters();
|
|
|
if (!CollectionUtils.isEmpty(filters)) {
|
|
|
// 筛选类目
|
|
|
- if (!StringUtils.isEmpty(filters.get(com.uas.search.utils.SearchConstants.COMPONENT_KINDID_KEY))) {
|
|
|
- String kindId = filters.get(com.uas.search.utils.SearchConstants.COMPONENT_KINDID_KEY).toString();
|
|
|
+ if (!StringUtils.isEmpty(filters.get(FilterField.COMPONENT_KINDID))) {
|
|
|
+ String kindId = filters.get(FilterField.COMPONENT_KINDID).toString();
|
|
|
TermQuery kindQuery = new TermQuery(new Term(SearchConstants.COMPONENT_KINDID_FIELD, kindId));
|
|
|
booleanQuery.add(kindQuery, BooleanClause.Occur.MUST);
|
|
|
}
|
|
|
|
|
|
// 筛选品牌
|
|
|
- if (!StringUtils.isEmpty(filters.get(com.uas.search.utils.SearchConstants.COMPONENT_BRANDID_KEY))) {
|
|
|
- String brandId = filters.get(com.uas.search.utils.SearchConstants.COMPONENT_BRANDID_KEY).toString();
|
|
|
+ if (!StringUtils.isEmpty(filters.get(FilterField.COMPONENT_BRANDID))) {
|
|
|
+ String brandId = filters.get(FilterField.COMPONENT_BRANDID).toString();
|
|
|
TermQuery brandQuery = new TermQuery(new Term(SearchConstants.COMPONENT_BRANDID_FIELD, brandId));
|
|
|
booleanQuery.add(brandQuery, BooleanClause.Occur.MUST);
|
|
|
}
|
|
|
|
|
|
// 库存不为0
|
|
|
- if (!StringUtils.isEmpty(filters.get(com.uas.search.utils.SearchConstants.COMPONENT_RESERVE_KEY))) {
|
|
|
- Boolean isReserveNotEmpty = (Boolean) filters
|
|
|
- .get(com.uas.search.utils.SearchConstants.COMPONENT_RESERVE_KEY);
|
|
|
+ if (!StringUtils.isEmpty(filters.get(FilterField.COMPONENT_HAS_RESERVE))) {
|
|
|
+ Boolean isReserveNotEmpty = (Boolean) filters.get(FilterField.COMPONENT_HAS_RESERVE);
|
|
|
if (isReserveNotEmpty) {
|
|
|
booleanQuery.add(NumericRangeQuery.newDoubleRange(SearchConstants.COMPONENT_RESERVE_FIELD, 0.0,
|
|
|
Double.MAX_VALUE, false, true), BooleanClause.Occur.MUST);
|
|
|
@@ -234,24 +236,19 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
}
|
|
|
|
|
|
// 现货、呆滞库存、样品数量不为0,取或的关系
|
|
|
- if (!StringUtils.isEmpty(filters.get(com.uas.search.utils.SearchConstants.COMPONENT_SAMPLE_QTY_KEY))
|
|
|
- || !StringUtils
|
|
|
- .isEmpty(filters.get(com.uas.search.utils.SearchConstants.COMPONENT_ORIGINAL_QTY_KEY))
|
|
|
- || !StringUtils.isEmpty(
|
|
|
- filters.get(com.uas.search.utils.SearchConstants.COMPONENT_INACTION_STOCK_QTY_KEY))) {
|
|
|
+ if (!StringUtils.isEmpty(filters.get(FilterField.COMPONENT_HAS_SAMPLE))
|
|
|
+ || !StringUtils.isEmpty(filters.get(FilterField.COMPONENT_HAS_ORIGINAL))
|
|
|
+ || !StringUtils.isEmpty(filters.get(FilterField.COMPONENT_HAS_INACTION_STOCK))) {
|
|
|
BooleanQuery booleanQuery2 = new BooleanQuery();
|
|
|
- if (!StringUtils
|
|
|
- .isEmpty(filters.get(com.uas.search.utils.SearchConstants.COMPONENT_SAMPLE_QTY_KEY))) {
|
|
|
+ if (!StringUtils.isEmpty(filters.get(FilterField.COMPONENT_HAS_SAMPLE))) {
|
|
|
booleanQuery2.add(NumericRangeQuery.newDoubleRange(SearchConstants.COMPONENT_SAMPLE_QTY_FIELD,
|
|
|
0.0, Double.MAX_VALUE, false, true), BooleanClause.Occur.SHOULD);
|
|
|
}
|
|
|
- if (!StringUtils
|
|
|
- .isEmpty(filters.get(com.uas.search.utils.SearchConstants.COMPONENT_ORIGINAL_QTY_KEY))) {
|
|
|
+ if (!StringUtils.isEmpty(filters.get(FilterField.COMPONENT_HAS_ORIGINAL))) {
|
|
|
booleanQuery2.add(NumericRangeQuery.newDoubleRange(SearchConstants.COMPONENT_ORIGINAL_QTY_FIELD,
|
|
|
0.0, Double.MAX_VALUE, false, true), BooleanClause.Occur.SHOULD);
|
|
|
}
|
|
|
- if (!StringUtils.isEmpty(
|
|
|
- filters.get(com.uas.search.utils.SearchConstants.COMPONENT_INACTION_STOCK_QTY_KEY))) {
|
|
|
+ if (!StringUtils.isEmpty(filters.get(FilterField.COMPONENT_HAS_INACTION_STOCK))) {
|
|
|
booleanQuery2.add(
|
|
|
NumericRangeQuery.newDoubleRange(SearchConstants.COMPONENT_INACTION_STOCK_QTY_FIELD,
|
|
|
0.0, Double.MAX_VALUE, false, true),
|
|
|
@@ -261,9 +258,9 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
}
|
|
|
|
|
|
// 属性过滤
|
|
|
- if (!StringUtils.isEmpty(filters.get(com.uas.search.utils.SearchConstants.COMPONENT_PROPERTIES_KEY))) {
|
|
|
- JSONObject proJSON = FastjsonUtils.parseObject(
|
|
|
- String.valueOf(filters.get(com.uas.search.utils.SearchConstants.COMPONENT_PROPERTIES_KEY)));
|
|
|
+ if (!StringUtils.isEmpty(filters.get(FilterField.COMPONENT_PROPERTIES))) {
|
|
|
+ JSONObject proJSON = FastjsonUtils
|
|
|
+ .parseObject(String.valueOf(filters.get(FilterField.COMPONENT_PROPERTIES)));
|
|
|
for (String key : proJSON.keySet()) {
|
|
|
String value = String.valueOf(proJSON.get(key));
|
|
|
if (!StringUtils.isEmpty(value)) {
|
|
|
@@ -337,7 +334,7 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
* @param keyword
|
|
|
* @return
|
|
|
*/
|
|
|
- public Query setBoost(String keyword) {
|
|
|
+ private Query setBoost(String keyword) {
|
|
|
BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
PrefixQuery prefixQuery = new PrefixQuery(
|
|
|
new Term(SearchConstants.COMPONENT_CODE_FIELD, keyword.toLowerCase()));
|
|
|
@@ -357,6 +354,29 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
return booleanQuery;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 同时搜索器件、类目、品牌,并设置boost
|
|
|
+ *
|
|
|
+ * @param keyword
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Query setGoodsBoost(String keyword) {
|
|
|
+ BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
+ BooleanQuery componentCodeQuery = SearchUtils.getBooleanQuery(SearchConstants.GOODS_CMP_CODE_FIELD, keyword);
|
|
|
+ componentCodeQuery.setBoost(100);
|
|
|
+ booleanQuery.add(componentCodeQuery, BooleanClause.Occur.SHOULD);
|
|
|
+ BooleanQuery brandNameCnQuery = SearchUtils.getBooleanQuery(SearchConstants.GOODS_BR_NAME_CN_FIELD, keyword);
|
|
|
+ brandNameCnQuery.setBoost(10);
|
|
|
+ booleanQuery.add(brandNameCnQuery, BooleanClause.Occur.SHOULD);
|
|
|
+ BooleanQuery brandNameEnQuery = SearchUtils.getBooleanQuery(SearchConstants.GOODS_BR_NAME_EN_FIELD, keyword);
|
|
|
+ brandNameEnQuery.setBoost(10);
|
|
|
+ booleanQuery.add(brandNameEnQuery, BooleanClause.Occur.SHOULD);
|
|
|
+ BooleanQuery kindNameQuery = SearchUtils.getBooleanQuery(SearchConstants.GOODS_KI_NAME_CN_FIELD, keyword);
|
|
|
+ kindNameQuery.setBoost(1);
|
|
|
+ booleanQuery.add(kindNameQuery, BooleanClause.Occur.SHOULD);
|
|
|
+ return booleanQuery;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public Set<Long> getKindIdsBySearchComponent(String keyword, String brandId) {
|
|
|
if (SearchUtils.isKeywordInvalid(keyword)) {
|
|
|
@@ -820,6 +840,86 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> getGoodsIds(String keyword, PageParams pageParams) throws SearchException {
|
|
|
+ // 因为器件、属性值的数据量远比类目、品牌大得多,而且器件搜索可能还需进行分页,
|
|
|
+ // 所以涉及器件、属性值的搜索,大都不能像类目和品牌一样直接利用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 = new BooleanQuery();
|
|
|
+ if (!SearchUtils.isKeywordInvalid(keyword)) {
|
|
|
+ booleanQuery.add(setGoodsBoost(keyword), BooleanClause.Occur.MUST);
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<FilterField, Object> filters = pageParams.getFilters();
|
|
|
+ if (!CollectionUtils.isEmpty(filters)) {
|
|
|
+ // 筛选类目
|
|
|
+ if (!StringUtils.isEmpty(filters.get(FilterField.GOODS_KINDID))) {
|
|
|
+ String kindId = filters.get(FilterField.GOODS_KINDID).toString();
|
|
|
+ TermQuery kindQuery = new TermQuery(new Term(SearchConstants.GOODS_KI_ID_FIELD, kindId));
|
|
|
+ booleanQuery.add(kindQuery, BooleanClause.Occur.MUST);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 筛选品牌
|
|
|
+ if (!StringUtils.isEmpty(filters.get(FilterField.GOODS_BRANDID))) {
|
|
|
+ String brandId = filters.get(FilterField.GOODS_BRANDID).toString();
|
|
|
+ TermQuery brandQuery = new TermQuery(new Term(SearchConstants.GOODS_BR_ID_FIELD, brandId));
|
|
|
+ booleanQuery.add(brandQuery, BooleanClause.Occur.MUST);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ logger.info(booleanQuery.toString());
|
|
|
+
|
|
|
+ Sort sort = new Sort(SortField.FIELD_SCORE);
|
|
|
+
|
|
|
+ TopDocs hits;
|
|
|
+ if (pageParams.getPage() > 1) {// 不是第一页
|
|
|
+ TopDocs previousHits = indexSearcher.search(booleanQuery,
|
|
|
+ (pageParams.getPage() - 1) * pageParams.getSize(), sort, true, false);
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+
|
|
|
+ ScoreDoc[] scoreDocs = hits.scoreDocs;
|
|
|
+ for (ScoreDoc scoreDoc : scoreDocs) {
|
|
|
+ // 数据量太大,需要指定将获取的数据(以免载入不必要的数据,降低速度)
|
|
|
+ Set<String> fieldsToLoad = new HashSet<>();
|
|
|
+ fieldsToLoad.add(SearchConstants.GOODS_CMP_ID_FIELD);
|
|
|
+ fieldsToLoad.add(SearchConstants.GOODS_GO_ID_FIELD);
|
|
|
+ Document document = indexSearcher.doc(scoreDoc.doc, fieldsToLoad);
|
|
|
+ String cmpId = document.get(SearchConstants.GOODS_CMP_ID_FIELD);
|
|
|
+ cmpIds.add(StringUtils.isEmpty(cmpId) ? null : Long.valueOf(cmpId));
|
|
|
+ String goId = document.get(SearchConstants.GOODS_GO_ID_FIELD);
|
|
|
+ goIds.add(StringUtils.isEmpty(goId) ? 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;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public KindSimpleInfo getKind(Long id) {
|
|
|
return DocumentToObjectUtils.toKind(
|
|
|
@@ -838,4 +938,10 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
SearchConstants.COMPONENT_ID_FIELD, id));
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public GoodsSimpleInfo getGoods(Long id) {
|
|
|
+ return DocumentToObjectUtils.toGoods(
|
|
|
+ SearchUtils.getDocumentById(SearchConstants.GOODS_TABLE_NAME, SearchConstants.GOODS_ID_FIELD, id));
|
|
|
+ }
|
|
|
+
|
|
|
}
|