Browse Source

批次搜索时对类目、品牌、货源、货币的筛选支持多选

sunyj 8 years ago
parent
commit
69632ea9b5

+ 32 - 2
search-console/src/main/java/com/uas/search/console/controller/SearchController.java

@@ -197,7 +197,22 @@ public class SearchController {
 			Set<Entry<String, Object>> entrySet = json.entrySet();
 			for (Entry<String, Object> entry : entrySet) {
 				FilterField field = FilterField.valueOf(entry.getKey());
-				filtersMap.put(field, entry.getValue());
+				String value = entry.getValue().toString();
+				switch (field) {
+				case GOODS_KINDID:
+				case GOODS_BRANDID:
+				case GOODS_STORE_TYPE:
+				case GOODS_CRNAME:
+					String[] strs = value.split(",");
+					List<Object> values = new ArrayList<>();
+					for (String str : strs) {
+						values.add(str);
+					}
+					filtersMap.put(field, values);
+					break;
+				default:
+					filtersMap.put(field, value);
+				}
 			}
 		}
 		pageParams.setFilters(filtersMap);
@@ -228,7 +243,22 @@ public class SearchController {
 			Set<Entry<String, Object>> entrySet = json.entrySet();
 			for (Entry<String, Object> entry : entrySet) {
 				FilterField field = FilterField.valueOf(entry.getKey());
-				filtersMap.put(field, entry.getValue());
+				String value = entry.getValue().toString();
+				switch (field) {
+				case GOODS_KINDID:
+				case GOODS_BRANDID:
+				case GOODS_STORE_TYPE:
+				case GOODS_CRNAME:
+					String[] strs = value.split(",");
+					List<Object> values = new ArrayList<>();
+					for (String str : strs) {
+						values.add(str);
+					}
+					filtersMap.put(field, values);
+					break;
+				default:
+					filtersMap.put(field, value);
+				}
 			}
 		}
 		return searchService.collectBySearchGoods(keyword, CollectField.valueOf(collectedField.toUpperCase()),

+ 39 - 27
search-console/src/main/java/com/uas/search/console/service/impl/SearchServiceImpl.java

@@ -317,7 +317,7 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 				ids.add(Long.parseLong(componentId));
 				// System.out.println(indexSearcher.explain(booleanQuery,
 				// scoreDoc.doc).toString());
-//				System.out.println(componentId + "\t" + scoreDoc.score);
+				// System.out.println(componentId + "\t" + scoreDoc.score);
 			}
 			map.put("componentIds", ids);
 			map.put("page", pageParams.getPage());
@@ -870,31 +870,26 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 			if (!CollectionUtils.isEmpty(filters)) {
 				// 筛选类目
 				if (!StringUtils.isEmpty(filters.get(FilterField.GOODS_KINDID))) {
-					String kindId = filters.get(FilterField.GOODS_KINDID).toString();
-					TermQuery query = new TermQuery(new Term(SearchConstants.GOODS_KI_ID_FIELD, kindId));
-					booleanQuery.add(query, BooleanClause.Occur.FILTER);
+					Object kindIds = filters.get(FilterField.GOODS_KINDID);
+					filter(kindIds, SearchConstants.GOODS_KI_ID_FIELD, booleanQuery);
 				}
 
 				// 筛选品牌
 				if (!StringUtils.isEmpty(filters.get(FilterField.GOODS_BRANDID))) {
-					String brandId = filters.get(FilterField.GOODS_BRANDID).toString();
-					TermQuery query = new TermQuery(new Term(SearchConstants.GOODS_BR_ID_FIELD, brandId));
-					booleanQuery.add(query, BooleanClause.Occur.FILTER);
+					Object brandIds = filters.get(FilterField.GOODS_BRANDID);
+					filter(brandIds, SearchConstants.GOODS_BR_ID_FIELD, booleanQuery);
 				}
 
 				// 筛选货源
 				if (!StringUtils.isEmpty(filters.get(FilterField.GOODS_STORE_TYPE))) {
-					String storeType = filters.get(FilterField.GOODS_STORE_TYPE).toString();
-					booleanQuery.add(
-							new TermQuery(new Term(SearchConstants.GOODS_ST_TYPE_FIELD, storeType.toLowerCase())),
-							BooleanClause.Occur.FILTER);
+					Object storeTypes = filters.get(FilterField.GOODS_STORE_TYPE);
+					filter(storeTypes, SearchConstants.GOODS_ST_TYPE_FIELD, booleanQuery);
 				}
 
 				// 筛选货币
 				if (!StringUtils.isEmpty(filters.get(FilterField.GOODS_CRNAME))) {
-					String crName = filters.get(FilterField.GOODS_CRNAME).toString();
-					booleanQuery.add(new TermQuery(new Term(SearchConstants.GOODS_CRNAME_FIELD, crName.toLowerCase())),
-							BooleanClause.Occur.FILTER);
+					Object crNames = filters.get(FilterField.GOODS_CRNAME);
+					filter(crNames, SearchConstants.GOODS_CRNAME_FIELD, booleanQuery);
 				}
 
 				// 价格筛选
@@ -993,7 +988,8 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 				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));
-//				System.out.println(cmpId + "\t" + goId + "\t" + scoreDoc.score);
+				// System.out.println(cmpId + "\t" + goId + "\t" +
+				// scoreDoc.score);
 			}
 			map.put("componentIds", cmpIds);
 			map.put("goodsIds", goIds);
@@ -1027,24 +1023,16 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 			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);
+					filter(entry.getValue(), SearchConstants.GOODS_KI_ID_FIELD, booleanQuery);
 					break;
 				case GOODS_BRANDID:
-					booleanQuery.add(
-							new TermQuery(new Term(SearchConstants.GOODS_BR_ID_FIELD, entry.getValue().toString())),
-							BooleanClause.Occur.FILTER);
+					filter(entry.getValue(), SearchConstants.GOODS_BR_ID_FIELD, booleanQuery);
 					break;
 				case GOODS_STORE_TYPE:
-					booleanQuery.add(new TermQuery(
-							new Term(SearchConstants.GOODS_ST_TYPE_FIELD, entry.getValue().toString().toLowerCase())),
-							BooleanClause.Occur.FILTER);
+					filter(entry.getValue(), SearchConstants.GOODS_ST_TYPE_FIELD, booleanQuery);
 					break;
 				case GOODS_CRNAME:
-					booleanQuery.add(new TermQuery(
-							new Term(SearchConstants.GOODS_CRNAME_FIELD, entry.getValue().toString().toLowerCase())),
-							BooleanClause.Occur.FILTER);
+					filter(entry.getValue(), SearchConstants.GOODS_CRNAME_FIELD, booleanQuery);
 					break;
 				default:
 					throw new SearchException("不支持该过滤字段:" + entry.getKey());
@@ -1091,6 +1079,30 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 
 	}
 
+	/**
+	 * 过滤
+	 * 
+	 * @param list
+	 *            过滤值列表
+	 * @param field
+	 *            过滤的字段
+	 * @param booleanQuery
+	 *            查询条件
+	 */
+	@SuppressWarnings("unchecked")
+	private void filter(Object list, String field, BooleanQuery booleanQuery) {
+		if (!(list instanceof List)) {
+			throw new SearchException("并非" + List.class + "类型:" + list);
+		}
+		List<Object> values = (List<Object>) list;
+		BooleanQuery booleanQuery2 = new BooleanQuery();
+		for (Object value : values) {
+			TermQuery query = new TermQuery(new Term(field, value.toString().toLowerCase()));
+			booleanQuery2.add(query, BooleanClause.Occur.SHOULD);
+		}
+		booleanQuery.add(booleanQuery2, BooleanClause.Occur.FILTER);
+	}
+
 	@Override
 	public KindSimpleInfo getKind(Long id) {
 		return DocumentToObjectUtils.toKind(

+ 2 - 2
search-console/src/main/webapp/WEB-INF/views/console.html

@@ -19,7 +19,7 @@
 					<li>search/componentIds?keyword=a&page=1&size=5&filters={"COMPONENT_KINDID":401,"COMPONENT_BRANDID":45,"COMPONENT_HAS_RESERVE":true,"COMPONENT_HAS_SAMPLE":true,"COMPONENT_HAS_ORIGINAL":true,"COMPONENT_HAS_INACTION_STOCK":true,"COMPONENT_PROPERTIES":{"275":"92%20dB","781":"Tube"}}</li>
 					<li><a target="_blank">search/componentIds?keyword=aaa</a></li>
 					<li><a target="_blank">search/components?keyword=aaa</a></li>
-					<li>search/goodsIds?keyword=aaa&page=1&size=8&filters={"GOODS_KINDID":401,"GOODS_BRANDID":45,"GOODS_STORE_TYPE":"DISTRIBUTION","GOODS_CRNAME":"RMB-USD","GOODS_MINPRICERMB":0,"GOODS_MAXPRICERMB":10,"GOODS_MINPRICEUSD":0,"GOODS_MAXPRICEUSD":10}&sort=[{"field":"GO_RESERVE","reverse":true},{"field":"GO_MINPRICERMB","reverse":true},{"field":"GO_MINPRICEUSD","reverse":true},{"field":"GO_SEARCH"}]</li>
+					<li>search/goodsIds?keyword=aaa&page=1&size=8&filters={"GOODS_KINDID":"401,23","GOODS_BRANDID":45,"GOODS_STORE_TYPE":"DISTRIBUTION","GOODS_CRNAME":"RMB-USD","GOODS_MINPRICERMB":0,"GOODS_MAXPRICERMB":10,"GOODS_MINPRICEUSD":0,"GOODS_MAXPRICEUSD":10}&sort=[{"field":"GO_RESERVE","reverse":true},{"field":"GO_MINPRICERMB","reverse":true},{"field":"GO_MINPRICEUSD","reverse":true},{"field":"GO_SEARCH"}]</li>
 					<li><a target="_blank">search/goodsIds?keyword=aaa</a></li>
 				</ol>
 
@@ -30,7 +30,7 @@
 					<li><a target="_blank">search/brandsByComponent?keyword=aaa&kindId=304</a></li>
 					<li><a target="_blank">search/kindIdsByComponent?keyword=aaa&brandId=56</a></li>
 					<li><a target="_blank">search/brandIdsByComponent?keyword=aaa&kindId=304</a></li>
-					<li><a target="_blank">search/collectBySearchGoods?keyword=23&collectedField=GOODS_KIND&filters={"GOODS_KINDID":401,"GOODS_BRANDID":45,"GOODS_STORE_TYPE":"DISTRIBUTION","GOODS_CRNAME":"RMB-USD"}</a></li>
+					<li><a target="_blank">search/collectBySearchGoods?keyword=23&collectedField=GOODS_KIND&filters={"GOODS_KINDID":"401,23","GOODS_BRANDID":45,"GOODS_STORE_TYPE":"DISTRIBUTION","GOODS_CRNAME":"RMB-USD"}</a></li>
 				</ol>
 
 				<strong><li class="title">联想词</li></strong>