sunyj 9 лет назад
Родитель
Сommit
c18cbaf023

+ 62 - 0
search-api-b2b/src/main/java/com/uas/search/b2b/model/MultiValue.java

@@ -0,0 +1,62 @@
+package com.uas.search.b2b.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 搜索时,一个字段可能对应多个值
+ * 
+ * @author sunyj
+ * @since 2016年11月28日 上午8:47:54
+ */
+public class MultiValue implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 字段对应的多个值
+	 */
+	private List<Object> values;
+
+	/**
+	 * 多个值之间默认是AND逻辑关系,若该成员变量为true,则为OR逻辑关系
+	 */
+	private boolean or = false;
+
+	public MultiValue() {
+		super();
+	}
+
+	public MultiValue(List<Object> values) {
+		super();
+		this.values = values;
+	}
+
+	public MultiValue(List<Object> values, boolean or) {
+		super();
+		this.values = values;
+		this.or = or;
+	}
+
+	public List<Object> getValues() {
+		return values;
+	}
+
+	public void setValues(List<Object> values) {
+		this.values = values;
+	}
+
+	public boolean isOr() {
+		return or;
+	}
+
+	public void setOr(boolean or) {
+		this.or = or;
+	}
+
+	@Override
+	public String toString() {
+		return "MultiValueField [values=" + values + ", or=" + or + "]";
+	}
+
+}

+ 5 - 3
search-api-b2b/src/main/java/com/uas/search/b2b/service/SearchService.java

@@ -165,10 +165,12 @@ public interface SearchService {
 	 *            不为空,单据类型
 	 * @param pageParams
 	 *            可为空,可能含有翻页信息,filters中可能有过滤信息,包括:1.状态、所属企业uu、其他状态(如已采纳、未采纳等),
-	 *            该部分参数的键为数据库表中相应的字段名称;2.开始时间(Long)、截止时间(Long),
+	 *            该部分参数的键为数据库表中相应的字段名称,值为字段对应的值,若值有多个,则使用com.uas.search.b2b.
+	 *            model.MultiValue,则;2.开始时间(Long)、截止时间(Long),
 	 *            这两个参数用于对时间范围进行筛选(包含开始和截止时间),键为com.uas.search.b2b.util.
-	 *            SearchConstants中的常量;3.排序方式(ArrayList(Sort)),键为com.uas.
-	 *            search.b2b.util.SearchConstants中的常量,值为排序的字段与其升、降序方式等
+	 *            SearchConstants中的常量;3.排序方式(ArrayList(Sort)),键为com.uas.search.
+	 *            b2b.util.SearchConstants中的常量,值为List(com.uas.search.b2b.model.
+	 *            Sort)
 	 * @return 单据id
 	 * @throws SearchException
 	 */

+ 14 - 1
search-console-b2b/src/main/java/com/uas/search/console/b2b/controller/SearchController.java

@@ -10,7 +10,9 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.uas.search.b2b.model.MultiValue;
 import com.uas.search.b2b.model.PageParams;
 import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.model.Sort;
@@ -41,7 +43,7 @@ public class SearchController {
 	@RequestMapping("")
 	@ResponseBody
 	public SPage<Long> searchIds(String keyword, String tableName, Integer page, Integer size, String filters,
-			String sort) {
+			String multiValueField, String sort) {
 		Table_name tbName = null;
 		if (!StringUtils.isEmpty(tableName)) {
 			tbName = Table_name.valueOf(tableName.toUpperCase());
@@ -57,12 +59,23 @@ public class SearchController {
 		if (!StringUtils.isEmpty(filters)) {
 			filtersMap.putAll(JSONObject.parseObject(filters));
 		}
+		if (!StringUtils.isEmpty(multiValueField)) {
+			JSONArray jsonArray = JSONObject.parseArray(multiValueField);
+			for (int i = 0; i < jsonArray.size(); i++) {
+				JSONObject jsonObject = jsonArray.getJSONObject(i);
+				String field = jsonObject.getString("field");
+				MultiValue multiValue = jsonObject.getObject("multiValue", MultiValue.class);
+				filtersMap.put(field, multiValue);
+			}
+		}
 		if (!StringUtils.isEmpty(sort)) {
 			filtersMap.put(SearchConstants.SORT_KEY, JSONObject.parseArray(sort, Sort.class));
 		}
 		if (!CollectionUtils.isEmpty(filtersMap)) {
 			pageParams.setFilters(filtersMap);
 		}
+		System.out.println(pageParams);
+		System.out.println(JSONObject.toJSONString(pageParams));
 		return searchService.searchIds(keyword, tbName, pageParams);
 	}
 

+ 1 - 1
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/impl/IndexServiceImpl.java

@@ -315,7 +315,7 @@ public class IndexServiceImpl implements IndexService {
 		}
 
 		Long endTime = new Date().getTime();
-		logger.info(totalElements + "条,耗时 " + (endTime - startTime) + " ms\n");
+		logger.info(String.format("下载数据%s条,耗时%.2fs\n ", totalElements, (endTime - startTime) / 1000.0));
 		return totalElements;
 	}
 

+ 13 - 9
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/impl/SearchServiceImpl.java

@@ -19,11 +19,13 @@ import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.Sort;
 import org.apache.lucene.search.SortField;
 import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.search.BooleanClause.Occur;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import com.uas.search.b2b.exception.SearchException;
+import com.uas.search.b2b.model.MultiValue;
 import com.uas.search.b2b.model.PageParams;
 import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.service.SearchService;
@@ -153,18 +155,20 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 					String field = ClassAndTableNameUtils.combineField(tableName, key);
 					/*
 					 * 对于明细、企业等所关联的表的数据,是以json格式存储的,搜索时可能会对明细等表中多个字段进行过滤,
-					 * 但是键都是明细等表在主表中所对应的字段名称,为了实现这样的过滤功能,需要将多个值放在List<Object>中,
-					 * 作为filters中key-value的value传递过来
+					 * 但是键都是明细等表在主表中所对应的字段名称,为了实现这样的过滤功能,需要将多个值放在com.uas.search.
+					 * b2b.model.MultiValue中, 作为filters中key-value的value传递过来
 					 */
-					if (value instanceof ArrayList) {
-						List<Object> list = (List<Object>) value;
-						for (Object object : list) {
-							booleanQuery.add(SearchUtils.getBooleanQuery(field, String.valueOf(object)),
-									BooleanClause.Occur.MUST);
+					if (value instanceof MultiValue) {
+						MultiValue multiValue = (MultiValue) value;
+						List<Object> values = multiValue.getValues();
+						Occur occur = multiValue.isOr() ? Occur.SHOULD : Occur.MUST;
+						BooleanQuery booleanQuery2 = new BooleanQuery();
+						for (Object object : values) {
+							booleanQuery2.add(SearchUtils.getBooleanQuery(field, String.valueOf(object)), occur);
 						}
+						booleanQuery.add(booleanQuery2, Occur.MUST);
 					} else {
-						booleanQuery.add(SearchUtils.getBooleanQuery(field, String.valueOf(value)),
-								BooleanClause.Occur.MUST);
+						booleanQuery.add(SearchUtils.getBooleanQuery(field, String.valueOf(value)), Occur.MUST);
 					}
 
 				}

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

@@ -10,7 +10,7 @@
 		<ol>
 			<strong><li class="title">搜索</li></strong>
 			<ol>
-				<li>search?keyword=PMP150&tableName=PURC$ORDERS&filters={"pu_status":200,"pu_enuu":10041166,"fromDate":1435680000000,"endDate":1479214994000}&sort=[{"field":"pu_id","reverse":1,"type":"LONG"},{"field":"pu_date","reverse":true,"type":"LONG","missingValue":2433211087000}]</li>
+				<li>search?keyword=P&tableName=PURC$ORDERS&filters={"pu_enuu":10041166,"fromDate":1435680000000,"endDate":1479214994000}&multiValueField=[{"field":"pu_status","multiValue":{"or":true,"values":[200,201]}}]&sort=[{"field":"pu_id","reverse":1,"type":"LONG"},{"field":"pu_date","reverse":true,"type":"LONG","missingValue":2433211087000}]</li>
 				<li><a target="_blank">search?keyword=PMP1506000&tableName=PURC$ORDERS</a></li>
 				<li><a target="_blank">search?keyword=MSQ150800&tableName=MAKE$ORDERS</a></li>
 			</ol>