|
|
@@ -8,6 +8,7 @@ import java.util.HashMap;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.Map.Entry;
|
|
|
import java.util.Set;
|
|
|
|
|
|
import org.apache.lucene.document.Document;
|
|
|
@@ -43,6 +44,8 @@ import com.uas.search.console.util.SearchConstants;
|
|
|
import com.uas.search.console.util.SearchUtils;
|
|
|
import com.uas.search.exception.SearchException;
|
|
|
import com.uas.search.grouping.DistinctGroupCollector;
|
|
|
+import com.uas.search.grouping.GoodsGroupCollector;
|
|
|
+import com.uas.search.model.CollectField;
|
|
|
import com.uas.search.model.PageParams;
|
|
|
import com.uas.search.model.PageParams.FilterField;
|
|
|
import com.uas.search.service.SearchService;
|
|
|
@@ -882,14 +885,15 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
// 筛选货源
|
|
|
if (!StringUtils.isEmpty(filters.get(FilterField.GOODS_STORE_TYPE))) {
|
|
|
String storeType = filters.get(FilterField.GOODS_STORE_TYPE).toString();
|
|
|
- booleanQuery.add(SearchUtils.getBooleanQuery(SearchConstants.GOODS_ST_TYPE_FIELD, storeType),
|
|
|
+ booleanQuery.add(
|
|
|
+ new TermQuery(new Term(SearchConstants.GOODS_ST_TYPE_FIELD, storeType.toLowerCase())),
|
|
|
BooleanClause.Occur.FILTER);
|
|
|
}
|
|
|
|
|
|
// 筛选货币
|
|
|
if (!StringUtils.isEmpty(filters.get(FilterField.GOODS_CRNAME))) {
|
|
|
String crName = filters.get(FilterField.GOODS_CRNAME).toString();
|
|
|
- booleanQuery.add(SearchUtils.getBooleanQuery(SearchConstants.GOODS_CRNAME_FIELD, crName),
|
|
|
+ booleanQuery.add(new TermQuery(new Term(SearchConstants.GOODS_CRNAME_FIELD, crName.toLowerCase())),
|
|
|
BooleanClause.Occur.FILTER);
|
|
|
}
|
|
|
|
|
|
@@ -928,25 +932,33 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
}
|
|
|
logger.info(booleanQuery.toString());
|
|
|
|
|
|
+ // 排序
|
|
|
Sort sort;
|
|
|
List<com.uas.search.model.Sort> sorts = pageParams.getSort();
|
|
|
if (sorts != null && !CollectionUtils.isEmpty(sorts)) {
|
|
|
SortField[] sortFields = new SortField[sorts.size()];
|
|
|
int i = 0;
|
|
|
for (com.uas.search.model.Sort s : sorts) {
|
|
|
+ if (s.getField() == null) {
|
|
|
+ throw new SearchException("排序字段不可为空:" + s);
|
|
|
+ }
|
|
|
switch (s.getField()) {
|
|
|
+ // 价格
|
|
|
case GO_RESERVE:
|
|
|
sortFields[i++] = new SortField(SearchConstants.GOODS_GO_RESERVE_FIELD, Type.DOUBLE,
|
|
|
s.isReverse());
|
|
|
break;
|
|
|
+ // 人民币价格
|
|
|
case GO_MINPRICERMB:
|
|
|
sortFields[i++] = new SortField(SearchConstants.GOODS_GO_MINPRICERMB_FIELD, Type.DOUBLE,
|
|
|
s.isReverse());
|
|
|
break;
|
|
|
+ // 美元价格
|
|
|
case GO_MINPRICEUSD:
|
|
|
sortFields[i++] = new SortField(SearchConstants.GOODS_GO_MINPRICEUSD_FIELD, Type.DOUBLE,
|
|
|
s.isReverse());
|
|
|
break;
|
|
|
+ // 打分
|
|
|
case GO_SEARCH:
|
|
|
sortFields[i++] = (SortField.FIELD_SCORE);
|
|
|
break;
|
|
|
@@ -996,6 +1008,89 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
return map;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<Map<String, Object>> collectBySearchGoods(String keyword, CollectField collectedField,
|
|
|
+ Map<FilterField, Object> filters) {
|
|
|
+ if (collectedField == null && CollectionUtils.isEmpty(filters)) {
|
|
|
+ throw new SearchException("参数不合法:collectedField=" + collectedField + ", filter=" + filters);
|
|
|
+ }
|
|
|
+ IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.GOODS_TABLE_NAME);
|
|
|
+
|
|
|
+ List<Map<String, Object>> result = new ArrayList<>();
|
|
|
+ try {
|
|
|
+ BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
+ if (!SearchUtils.isKeywordInvalid(keyword)) {
|
|
|
+ booleanQuery.add(setGoodsBoost(keyword), BooleanClause.Occur.MUST);
|
|
|
+ }
|
|
|
+ // 过滤
|
|
|
+ Set<Entry<FilterField, Object>> entrySet = filters.entrySet();
|
|
|
+ for (Entry<FilterField, Object> entry : entrySet) {
|
|
|
+ switch (entry.getKey()) {
|
|
|
+ case GOODS_KINDID:
|
|
|
+ booleanQuery.add(
|
|
|
+ new TermQuery(new Term(SearchConstants.GOODS_KI_ID_FIELD, entry.getValue().toString())),
|
|
|
+ BooleanClause.Occur.FILTER);
|
|
|
+ break;
|
|
|
+ case GOODS_BRANDID:
|
|
|
+ booleanQuery.add(
|
|
|
+ new TermQuery(new Term(SearchConstants.GOODS_BR_ID_FIELD, entry.getValue().toString())),
|
|
|
+ BooleanClause.Occur.FILTER);
|
|
|
+ break;
|
|
|
+ case GOODS_STORE_TYPE:
|
|
|
+ booleanQuery.add(new TermQuery(
|
|
|
+ new Term(SearchConstants.GOODS_ST_TYPE_FIELD, entry.getValue().toString().toLowerCase())),
|
|
|
+ BooleanClause.Occur.FILTER);
|
|
|
+ break;
|
|
|
+ case GOODS_CRNAME:
|
|
|
+ booleanQuery.add(new TermQuery(
|
|
|
+ new Term(SearchConstants.GOODS_CRNAME_FIELD, entry.getValue().toString().toLowerCase())),
|
|
|
+ BooleanClause.Occur.FILTER);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new SearchException("不支持该过滤字段:" + entry.getKey());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ logger.info(booleanQuery.toString());
|
|
|
+
|
|
|
+ // 统计
|
|
|
+ String uniqueField;
|
|
|
+ Set<String> fieldsToLoad = new HashSet<>();
|
|
|
+ switch (collectedField) {
|
|
|
+ case GOODS_KIND:
|
|
|
+ uniqueField = SearchConstants.GOODS_KI_ID_FIELD;
|
|
|
+ fieldsToLoad.add(SearchConstants.GOODS_KI_ID_FIELD);
|
|
|
+ fieldsToLoad.add(SearchConstants.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);
|
|
|
+ break;
|
|
|
+ case GOODS_STORE_TYPE:
|
|
|
+ uniqueField = SearchConstants.GOODS_ST_TYPE_FIELD;
|
|
|
+ fieldsToLoad.add(SearchConstants.GOODS_ST_TYPE_FIELD);
|
|
|
+ break;
|
|
|
+ case GOODS_CRNAME:
|
|
|
+ uniqueField = SearchConstants.GOODS_CRNAME_FIELD;
|
|
|
+ fieldsToLoad.add(SearchConstants.GOODS_CRNAME_FIELD);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new SearchException("不支持该统计字段:" + collectedField);
|
|
|
+ }
|
|
|
+ GoodsGroupCollector collector = new GoodsGroupCollector(uniqueField, fieldsToLoad);
|
|
|
+ indexSearcher.search(booleanQuery, collector);
|
|
|
+ result = collector.getValues();
|
|
|
+ } catch (IOException e) {
|
|
|
+ logger.error("", e);
|
|
|
+ } finally {
|
|
|
+ SearchUtils.releaseIndexSearcher(indexSearcher);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public KindSimpleInfo getKind(Long id) {
|
|
|
return DocumentToObjectUtils.toKind(
|