Browse Source

增加批次搜索实现

sunyj 8 years ago
parent
commit
6d1ed0fbcc

+ 14 - 0
search-console/src/main/java/com/uas/search/console/LuceneProperties.java

@@ -12,6 +12,9 @@ public class LuceneProperties {
 	@Value("${lucene.components.dir}")
 	private String componentsDir;
 
+	@Value("${lucene.goods.dir}")
+	private String goodsDir;
+
 	/**
 	 * 索引文件存储路径
 	 */
@@ -34,4 +37,15 @@ public class LuceneProperties {
 		this.componentsDir = componentsDir;
 	}
 
+	/**
+	 * 存放批次数据的文件,用于创建索引
+	 */
+	public String getGoodsDir() {
+		return goodsDir;
+	}
+
+	public void setGoodsDir(String goodsDir) {
+		this.goodsDir = goodsDir;
+	}
+
 }

+ 8 - 9
search-console/src/main/java/com/uas/search/console/controller/OrderSearchController.java

@@ -20,13 +20,12 @@ import com.uas.search.console.model.PurchaseInvoiceSimpleInfo;
 import com.uas.search.console.model.PurchaseSimpleInfo;
 import com.uas.search.console.service.InnerOrderSearchService;
 import com.uas.search.console.service.impl.OrderSearchServiceImpl;
-import com.uas.search.console.util.SearchConstants;
 import com.uas.search.exception.SearchException;
 import com.uas.search.model.BaseOrder;
 import com.uas.search.model.PageParams;
+import com.uas.search.model.PageParams.FilterField;
 import com.uas.search.model.SPage;
 import com.uas.search.service.OrderSearchService.Table_name;
-import com.uas.search.utils.OrderSearchConstants;
 
 /**
  * 订单搜索请求
@@ -60,29 +59,29 @@ public class OrderSearchController {
 		if (size != null) {
 			params.setSize(size);
 		}
-		Map<String, Object> filters = new HashMap<>();
+		Map<FilterField, Object> filters = new HashMap<>();
 		if (!StringUtils.isEmpty(status)) {
 			String[] strs = status.split(",");
 			List<Integer> statusList = new ArrayList<>();
 			for (String str : strs) {
 				statusList.add(Integer.valueOf(str));
 			}
-			filters.put(OrderSearchConstants.STATUS_KEY, statusList);
+			filters.put(FilterField.ORDER_STATUS, statusList);
 		}
 		if (buyeruu != null) {
-			filters.put(OrderSearchConstants.BUYER_UU_KEY, buyeruu);
+			filters.put(FilterField.ORDER_BUYER_UU, buyeruu);
 		}
 		if (buyerenuu != null) {
-			filters.put(OrderSearchConstants.BUYER_EN_UU_KEY, buyerenuu);
+			filters.put(FilterField.ORDER_BUYER_EN_UU, buyerenuu);
 		}
 		if (sellerenuu != null) {
-			filters.put(OrderSearchConstants.SELLER_EN_UU_KEY, sellerenuu);
+			filters.put(FilterField.ORDER_SELLER_EN_UU, sellerenuu);
 		}
 		if (mintime != null) {
-			filters.put(SearchConstants.MIN_TIME_KEY, parseTime(mintime));
+			filters.put(FilterField.ORDER_MIN_TIME, parseTime(mintime));
 		}
 		if (maxtime != null) {
-			filters.put(SearchConstants.MAX_TIME_KEY, parseTime(maxtime));
+			filters.put(FilterField.ORDER_MAX_TIME, parseTime(maxtime));
 		}
 		params.setFilters(filters);
 		return orderSearchService.getOrderIdsWithDetail(keyword, tbName, params);

+ 33 - 3
search-console/src/main/java/com/uas/search/console/controller/SearchController.java

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,6 +23,7 @@ import com.uas.search.console.model.ComponentSimpleInfo;
 import com.uas.search.console.model.KindSimpleInfo;
 import com.uas.search.console.service.InnerSearchService;
 import com.uas.search.model.PageParams;
+import com.uas.search.model.PageParams.FilterField;
 import com.uas.search.service.SearchService;
 
 /**
@@ -74,9 +76,14 @@ public class SearchController {
 		if (size != null) {
 			pageParams.setSize(size);
 		}
-		Map<String, Object> filtersMap = new HashMap<>();
+		Map<FilterField, Object> filtersMap = new HashMap<>();
 		if (!StringUtils.isEmpty(filters)) {
-			filtersMap.putAll(JSONObject.parseObject(filters));
+			JSONObject json = JSONObject.parseObject(filters);
+			Set<Entry<String, Object>> entrySet = json.entrySet();
+			for (Entry<String, Object> entry : entrySet) {
+				FilterField field = FilterField.valueOf(entry.getKey().toUpperCase());
+				filtersMap.put(field, entry.getValue());
+			}
 		}
 		pageParams.setFilters(filtersMap);
 		return searchService.getComponentIds(keyword, pageParams);
@@ -99,7 +106,7 @@ public class SearchController {
 		for (Long id : ids) {
 			idsLong[i++] = id;
 		}
-		return componentDao.findByIdsInOrder(idsLong);
+		return componentDao.findAll(ids);
 	}
 
 	@RequestMapping("/kindIdsByComponent")
@@ -169,6 +176,29 @@ public class SearchController {
 		return searchService.getSimilarPropertyValues(kindId, propertyId, keyword, topNum);
 	}
 
+	@RequestMapping("/goodsIds")
+	@ResponseBody
+	public Map<String, Object> getGoodsIds(String keyword, Integer page, Integer size, String filters) {
+		PageParams pageParams = new PageParams();
+		if (page != null) {
+			pageParams.setPage(page);
+		}
+		if (size != null) {
+			pageParams.setSize(size);
+		}
+		Map<FilterField, Object> filtersMap = new HashMap<>();
+		if (!StringUtils.isEmpty(filters)) {
+			JSONObject json = JSONObject.parseObject(filters);
+			Set<Entry<String, Object>> entrySet = json.entrySet();
+			for (Entry<String, Object> entry : entrySet) {
+				FilterField field = FilterField.valueOf(entry.getKey());
+				filtersMap.put(field, entry.getValue());
+			}
+		}
+		pageParams.setFilters(filtersMap);
+		return searchService.getGoodsIds(keyword, pageParams);
+	}
+
 	@RequestMapping("/kind/{id}")
 	@ResponseBody
 	public KindSimpleInfo getKind(@PathVariable Long id) {

+ 0 - 36
search-console/src/main/java/com/uas/search/console/dao/ComponentSimpleInfoDao.java

@@ -1,11 +1,7 @@
 package com.uas.search.console.dao;
 
-import java.util.List;
-
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 import com.uas.search.console.model.ComponentSimpleInfo;
@@ -18,36 +14,4 @@ import com.uas.search.console.model.ComponentSimpleInfo;
 public interface ComponentSimpleInfoDao
 		extends JpaSpecificationExecutor<ComponentSimpleInfo>, JpaRepository<ComponentSimpleInfo, Long> {
 
-	/**
-	 * 根据id获取器件
-	 * 
-	 * @param id
-	 * @return
-	 */
-	public ComponentSimpleInfo findById(Long id);
-
-	/**
-	 * 根据类目kindid获取器件
-	 * 
-	 * @param kindid
-	 * @return
-	 */
-	public List<ComponentSimpleInfo> findByKindId(Long kindId);
-
-	/**
-	 * 根据品牌brandid获取器件
-	 * 
-	 * @param brandid
-	 * @return
-	 */
-	public List<ComponentSimpleInfo> findByBrandId(Long brandId);
-
-	/**
-	 * 按id获取器件,并且按照给定的id的顺序
-	 * 
-	 * @param ids
-	 * @return
-	 */
-	@Query("select c from ComponentSimpleInfo c where c.id in (:ids) order by instr(':ids', c.id)")
-	public List<ComponentSimpleInfo> findByIdsInOrder(@Param("ids") Long[] ids);
 }

+ 17 - 0
search-console/src/main/java/com/uas/search/console/dao/GoodsSimpleInfoDao.java

@@ -0,0 +1,17 @@
+package com.uas.search.console.dao;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import com.uas.search.console.model.GoodsSimpleInfo;
+
+/**
+ * @author sunyj
+ * @since 2017年7月8日 下午7:45:01
+ */
+@Repository
+public interface GoodsSimpleInfoDao
+		extends JpaSpecificationExecutor<GoodsSimpleInfo>, JpaRepository<GoodsSimpleInfo, Long> {
+
+}

+ 220 - 0
search-console/src/main/java/com/uas/search/console/model/GoodsSimpleInfo.java

@@ -0,0 +1,220 @@
+package com.uas.search.console.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+/**
+ * 器件批次
+ * 
+ * @author sunyj
+ * @since 2017年7月8日 下午5:14:08
+ */
+@Entity
+@Table(name = "V$PRODUCT$CMPGOODS")
+public class GoodsSimpleInfo implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * id
+	 */
+	@Id
+	@Column(name = "ID")
+	private String id;
+
+	/**
+	 * 批次id
+	 */
+	@Column(name = "GO_ID")
+	private Long goId;
+
+	/**
+	 * 批次的库存
+	 */
+	@Column(name = "GO_RESERVE")
+	private Double goReserve;
+
+	/**
+	 * 批次的人民币价格
+	 */
+	@Column(name = "GO_MINPRICERMB")
+	private Double goMinPriceRMB;
+
+	/**
+	 * 批次的美元价格
+	 */
+	@Column(name = "GO_MINPRICEUSD")
+	private Double goMinPriceUSD;
+
+	/**
+	 * 货币
+	 */
+	@Column(name = "CR_NAME")
+	private String crName;
+
+	/**
+	 * 货源id
+	 */
+	@Column(name = "GO_STOREID")
+	private Long storeId;
+
+	/**
+	 * 货源
+	 */
+	@Transient
+	private StoreSimpleInfo store;
+
+	/**
+	 * 器件的id
+	 */
+	@Column(name = "CMP_ID")
+	private Long cmpId;
+
+	/**
+	 * 原厂型号
+	 */
+	@Column(name = "CMP_CODE")
+	private String cmpCode;
+
+	/**
+	 * 类目id
+	 */
+	@Column(name = "CMP_KIID")
+	private Long kindId;
+
+	/**
+	 * 类目
+	 */
+	@Transient
+	private KindSimpleInfo kind;
+
+	/**
+	 * 品牌id
+	 */
+	@Column(name = "CMP_BRID")
+	private Long brandId;
+
+	/**
+	 * 品牌
+	 */
+	@Transient
+	private BrandSimpleInfo brand;
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public Long getGoId() {
+		return goId;
+	}
+
+	public void setGoId(Long goId) {
+		this.goId = goId;
+	}
+
+	public Double getGoReserve() {
+		return goReserve;
+	}
+
+	public void setGoReserve(Double goReserve) {
+		this.goReserve = goReserve;
+	}
+
+	public Double getGoMinPriceRMB() {
+		return goMinPriceRMB;
+	}
+
+	public void setGoMinPriceRMB(Double goMinPriceRMB) {
+		this.goMinPriceRMB = goMinPriceRMB;
+	}
+
+	public Double getGoMinPriceUSD() {
+		return goMinPriceUSD;
+	}
+
+	public void setGoMinPriceUSD(Double goMinPriceUSD) {
+		this.goMinPriceUSD = goMinPriceUSD;
+	}
+
+	public String getCrName() {
+		return crName;
+	}
+
+	public void setCrName(String crName) {
+		this.crName = crName;
+	}
+
+	public StoreSimpleInfo getStore() {
+		return store;
+	}
+
+	public void setStore(StoreSimpleInfo store) {
+		this.store = store;
+	}
+
+	public Long getCmpId() {
+		return cmpId;
+	}
+
+	public void setCmpId(Long cmpId) {
+		this.cmpId = cmpId;
+	}
+
+	public String getCmpCode() {
+		return cmpCode;
+	}
+
+	public void setCmpCode(String cmpCode) {
+		this.cmpCode = cmpCode;
+	}
+
+	public Long getKindId() {
+		return kindId;
+	}
+
+	public void setKindId(Long kindId) {
+		this.kindId = kindId;
+	}
+
+	public KindSimpleInfo getKind() {
+		return kind;
+	}
+
+	public void setKind(KindSimpleInfo kind) {
+		this.kind = kind;
+	}
+
+	public Long getBrandId() {
+		return brandId;
+	}
+
+	public void setBrandId(Long brandId) {
+		this.brandId = brandId;
+	}
+
+	public BrandSimpleInfo getBrand() {
+		return brand;
+	}
+
+	public void setBrand(BrandSimpleInfo brand) {
+		this.brand = brand;
+	}
+
+	@Override
+	public String toString() {
+		return "GoodsSimpleInfo [id=" + id + ", goId=" + goId + ", goReserve=" + goReserve + ", goMinPriceRMB="
+				+ goMinPriceRMB + ", goMinPriceUSD=" + goMinPriceUSD + ", crName=" + crName + ", store=" + store
+				+ ", cmpId=" + cmpId + ", cmpCode=" + cmpCode + ", kindId=" + kindId + ", kind=" + kind + ", brandId="
+				+ brandId + ", brand=" + brand + "]";
+	}
+
+}

+ 56 - 0
search-console/src/main/java/com/uas/search/console/model/StoreSimpleInfo.java

@@ -0,0 +1,56 @@
+package com.uas.search.console.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * 店铺
+ * 
+ * @author sunyj
+ * @since 2017年7月8日 下午6:14:26
+ */
+@Entity
+@Table(name = "STORE$INFO")
+public class StoreSimpleInfo implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * id
+	 */
+	@Id
+	@Column(name = "ST_UUID")
+	private String uuid;
+
+	/**
+	 * 类型
+	 */
+	@Column(name = "ST_TYPE")
+	private String type;
+
+	public String getUuid() {
+		return uuid;
+	}
+
+	public void setUuid(String uuid) {
+		this.uuid = uuid;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	@Override
+	public String toString() {
+		return "StoreSimpleInfo [uuid=" + uuid + ", type=" + type + "]";
+	}
+
+}

+ 9 - 0
search-console/src/main/java/com/uas/search/console/service/InnerSearchService.java

@@ -2,6 +2,7 @@ package com.uas.search.console.service;
 
 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;
 
 /**
@@ -34,4 +35,12 @@ public interface InnerSearchService {
 	 * @return
 	 */
 	public ComponentSimpleInfo getComponent(Long id);
+
+	/**
+	 * 根据id获取批次
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public GoodsSimpleInfo getGoods(Long id);
 }

+ 46 - 2
search-console/src/main/java/com/uas/search/console/service/impl/IndexServiceImpl.java

@@ -40,6 +40,7 @@ import com.uas.search.console.jms.AQListener;
 import com.uas.search.console.jms.QueueMessageParser;
 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.model.LuceneQueueMessage;
 import com.uas.search.console.model.OrderInvoiceSimpleInfo;
@@ -153,8 +154,10 @@ public class IndexServiceImpl implements IndexService {
 					if (componentFromFiles != null && !componentFromFiles) {
 						size = createComponentIndexes();
 					} else {
-						size = createComponentIndexesWithFiles();
+						size = createComponentIndexesFromFiles();
 					}
+				} else if (tableName.equals(SearchConstants.GOODS_TABLE_NAME)) {
+					size = createGoodsIndexesFromFiles();
 				} else if (tableName.equals(SearchConstants.ORDER_TABLE_NAME)) {
 					size = createOrderIndexes();
 				} else if (tableName.equals(SearchConstants.ORDER_INVOICE_TABLE_NAME)) {
@@ -225,7 +228,7 @@ public class IndexServiceImpl implements IndexService {
 		return createIndexesWithObjects(brands.toArray());
 	}
 
-	private Long createComponentIndexesWithFiles() {
+	private Long createComponentIndexesFromFiles() {
 		logger.info("正在创建器件索引...");
 		Long size = 0L;
 		try {
@@ -314,6 +317,47 @@ public class IndexServiceImpl implements IndexService {
 		return size;
 	}
 
+	private Long createGoodsIndexesFromFiles() {
+		logger.info("正在创建批次索引...");
+		Long size = 0L;
+		try {
+			// 从本地路径读取批次数据
+			File[] files = new File(luceneProperties.getGoodsDir()).listFiles();
+			if (files == null || files.length == 0) {
+				logger.info("创建批次索引失败,原因:批次数据文件不存在!");
+				return 0L;
+			}
+			// 将要创建的索引总数目约为:文件数目*单个文件的行数
+			long totalSize = files.length * SINGLE_FILE_MAX_SIZE;
+			for (File file : files) {
+				logger.info("读取文件: " + file.getName());
+				BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
+				String line = null;
+				while (!StringUtils.isEmpty(line = bufferedReader.readLine())) {
+					GoodsSimpleInfo goods = JSONObject.parseObject(line, GoodsSimpleInfo.class);
+					Document document = ObjectToDocumentUtils.toDocument(goods);
+					if (document != null) {
+						size++;
+						// 每创建10000条,打印一次进度
+						if (size % 10000 == 0) {
+							logger.info(
+									String.format("Goods indexed...................%.2f%%", size * 100.0 / totalSize));
+						}
+						indexWriter.addDocument(document);
+					}
+				}
+				indexWriter.commit();
+				bufferedReader.close();
+			}
+		} catch (FileNotFoundException e) {
+			logger.error("创建批次索引失败,原因:批次数据文件不存在!");
+			return 0L;
+		} catch (IOException e) {
+			logger.error("", e);
+		}
+		return size;
+	}
+
 	private Long createOrderIndexes() {
 		logger.info("正在创建销售单索引...");
 		List<OrderSimpleInfo> orders = orderDao.findAll();

+ 131 - 25
search-console/src/main/java/com/uas/search/console/service/impl/SearchServiceImpl.java

@@ -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));
+	}
+
 }

+ 16 - 4
search-console/src/main/java/com/uas/search/console/util/DocumentToObjectUtils.java

@@ -14,6 +14,7 @@ import com.uas.search.console.model.BaseOrderDetailSimpleInfo;
 import com.uas.search.console.model.BrandSimpleInfo;
 import com.uas.search.console.model.ComponentSimpleInfo;
 import com.uas.search.console.model.EnterpriseSimpleInfo;
+import com.uas.search.console.model.GoodsSimpleInfo;
 import com.uas.search.console.model.KindSimpleInfo;
 import com.uas.search.console.model.OrderDetailSimpleInfo;
 import com.uas.search.console.model.OrderInvoiceDetailSimpleInfo;
@@ -112,6 +113,17 @@ public class DocumentToObjectUtils {
 		return component;
 	}
 
+	/**
+	 * 将Document转换为批次对象
+	 * 
+	 * @param document
+	 * @return
+	 */
+	public static GoodsSimpleInfo toGoods(Document document) {
+		// TODO
+		return null;
+	}
+
 	/**
 	 * 将Document转换为销售单对象
 	 * 
@@ -135,7 +147,7 @@ public class DocumentToObjectUtils {
 		sellerEnterprise.setUu(Long.valueOf(document.get(SearchConstants.ORDER_SELLERENUU_FIELD)));
 		sellerEnterprise.setEnName(document.get(SearchConstants.ORDER_SELLERENNAME_FIELD));
 		order.setSellerEnterprise(sellerEnterprise);
-		Date createtime = new Date(Long.valueOf(document.get(SearchConstants.ORDER_CREATETIME_FIELD)));
+		Date createtime = new Date(Long.valueOf(document.get(SearchConstants.CREATETIME_FIELD)));
 		order.setCreatetime(createtime);
 		order.setStatus(Integer.valueOf(document.get(SearchConstants.ORDER_STATUS_FIELD)));
 		order.setDetails(toDetailsSet(document.get(SearchConstants.ORDER_DETAILS_FIELD), OrderDetailSimpleInfo.class));
@@ -161,7 +173,7 @@ public class DocumentToObjectUtils {
 		buyerEnterprise.setUu(Long.valueOf(document.get(SearchConstants.ORDER_INVOICE_BUYERENUU_FIELD)));
 		buyerEnterprise.setEnName(document.get(SearchConstants.ORDER_INVOICE_BUYERENNAME_FIELD));
 		orderInvoice.setBuyerEnterprise(buyerEnterprise);
-		Date createtime = new Date(Long.valueOf(document.get(SearchConstants.ORDER_INVOICE_CREATETIME_FIELD)));
+		Date createtime = new Date(Long.valueOf(document.get(SearchConstants.CREATETIME_FIELD)));
 		orderInvoice.setCreatetime(createtime);
 		orderInvoice.setStatus(Integer.valueOf(document.get(SearchConstants.ORDER_INVOICE_STATUS_FIELD)));
 		orderInvoice.setDetails(toDetailsSet(document.get(SearchConstants.ORDER_INVOICE_DETAILS_FIELD),
@@ -184,7 +196,7 @@ public class DocumentToObjectUtils {
 		purchase.setCode(document.get(SearchConstants.PURCHASE_CODE_FIELD));
 		purchase.setSellerenuu(Long.valueOf(document.get(SearchConstants.PURCHASE_SELLERENUU_FIELD)));
 		purchase.setSellerenname(document.get(SearchConstants.PURCHASE_SELLERENNAME_FIELD));
-		Date createtime = new Date(Long.valueOf(document.get(SearchConstants.PURCHASE_CREATETIME_FIELD)));
+		Date createtime = new Date(Long.valueOf(document.get(SearchConstants.CREATETIME_FIELD)));
 		purchase.setCreatetime(createtime);
 		purchase.setStatus(Integer.valueOf(document.get(SearchConstants.PURCHASE_STATUS_FIELD)));
 		purchase.setDetails(
@@ -207,7 +219,7 @@ public class DocumentToObjectUtils {
 		purchaseInvoice.setCode(document.get(SearchConstants.PURCHASE_INVOICE_CODE_FIELD));
 		purchaseInvoice.setSellerenuu(Long.valueOf(document.get(SearchConstants.PURCHASE_INVOICE_SELLERENUU_FIELD)));
 		purchaseInvoice.setSellerenname(document.get(SearchConstants.PURCHASE_INVOICE_SELLERENNAME_FIELD));
-		Date createtime = new Date(Long.valueOf(document.get(SearchConstants.PURCHASE_INVOICE_CREATETIME_FIELD)));
+		Date createtime = new Date(Long.valueOf(document.get(SearchConstants.CREATETIME_FIELD)));
 		purchaseInvoice.setCreatetime(createtime);
 		purchaseInvoice.setStatus(Integer.valueOf(document.get(SearchConstants.PURCHASE_INVOICE_STATUS_FIELD)));
 		purchaseInvoice.setDetails(toDetailsSet(document.get(SearchConstants.PURCHASE_INVOICE_DETAILS_FIELD),

+ 88 - 7
search-console/src/main/java/com/uas/search/console/util/ObjectToDocumentUtils.java

@@ -5,9 +5,11 @@ import java.util.Set;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.lucene.document.BinaryDocValuesField;
 import org.apache.lucene.document.Document;
+import org.apache.lucene.document.DoubleDocValuesField;
 import org.apache.lucene.document.DoubleField;
 import org.apache.lucene.document.Field.Store;
 import org.apache.lucene.document.LongField;
+import org.apache.lucene.document.NumericDocValuesField;
 import org.apache.lucene.document.StringField;
 import org.apache.lucene.document.TextField;
 import org.apache.lucene.util.BytesRef;
@@ -16,12 +18,14 @@ import org.springframework.util.StringUtils;
 import com.alibaba.fastjson.JSONObject;
 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.model.OrderInvoiceSimpleInfo;
 import com.uas.search.console.model.OrderSimpleInfo;
 import com.uas.search.console.model.PropertyValueSimpleInfo;
 import com.uas.search.console.model.PurchaseInvoiceSimpleInfo;
 import com.uas.search.console.model.PurchaseSimpleInfo;
+import com.uas.search.console.model.StoreSimpleInfo;
 
 import net.sf.ehcache.search.SearchException;
 
@@ -174,6 +178,84 @@ public class ObjectToDocumentUtils {
 		return document;
 	}
 
+	/**
+	 * GoodsSimpleInfo对象转为Document
+	 * 
+	 * @param goods
+	 * @return
+	 */
+	public static Document toDocument(GoodsSimpleInfo goods) {
+		if (goods == null || goods.getId() == null || StringUtils.isEmpty(goods.getCmpId())
+				|| StringUtils.isEmpty(goods.getCmpCode()) || goods.getKind() == null || goods.getBrand() == null) {
+			return null;
+		}
+
+		Document document = new Document();
+		document.add(new StringField(SearchConstants.GOODS_ID_FIELD, goods.getId(), Store.YES));
+		if (goods.getGoId() != null) {
+			document.add(
+					new StringField(SearchConstants.GOODS_GO_ID_FIELD, String.valueOf(goods.getGoId()), Store.YES));
+		}
+		if (goods.getGoReserve() != null) {
+			document.add(new DoubleDocValuesField(SearchConstants.GOODS_GO_RESERVE_FIELD, goods.getGoReserve()));
+		}
+		if (goods.getGoMinPriceRMB() != null) {
+			document.add(
+					new DoubleDocValuesField(SearchConstants.GOODS_GO_MINPRICERMB_FIELD, goods.getGoMinPriceRMB()));
+		}
+		if (goods.getGoMinPriceUSD() != null) {
+			document.add(
+					new DoubleDocValuesField(SearchConstants.GOODS_GO_MINPRICEUSD_FIELD, goods.getGoMinPriceUSD()));
+		}
+		if (goods.getCrName() != null) {
+			document.add(new TextField(SearchConstants.GOODS_CRNAME_FIELD, goods.getCrName(), Store.YES));
+		}
+
+		if (goods.getStore() != null) {
+			StoreSimpleInfo store = goods.getStore();
+			if (store.getUuid() != null) {
+				document.add(
+						new StringField(SearchConstants.GOODS_ST_ID_FIELD, String.valueOf(store.getUuid()), Store.YES));
+			}
+			if (store.getType() != null) {
+				document.add(new StringField(SearchConstants.GOODS_ST_TYPE_FIELD, store.getType(), Store.YES));
+			}
+		}
+
+		document.add(new StringField(SearchConstants.GOODS_CMP_ID_FIELD, String.valueOf(goods.getCmpId()), Store.YES));
+		document.add(new TextField(SearchConstants.GOODS_CMP_CODE_FIELD, goods.getCmpCode(), Store.YES));
+
+		KindSimpleInfo kind = goods.getKind();
+		if (kind.getId() != null) {
+			document.add(new StringField(SearchConstants.GOODS_KI_ID_FIELD, String.valueOf(kind.getId()), Store.YES));
+		}
+		if (kind.getNameCn() != null) {
+			document.add(new TextField(SearchConstants.GOODS_KI_NAME_CN_FIELD, kind.getNameCn(), Store.YES));
+		}
+		if (kind.getLevel() != null) {
+			document.add(new NumericDocValuesField(SearchConstants.GOODS_KI_LEVEL_FIELD, kind.getIsLeaf()));
+		}
+		if (kind.getIsLeaf() != null) {
+			document.add(
+					new StringField(SearchConstants.GOODS_KI_ISLEAF_FIELD, String.valueOf(kind.getLevel()), Store.YES));
+		}
+
+		BrandSimpleInfo brand = goods.getBrand();
+		if (brand.getId() != null) {
+			document.add(new StringField(SearchConstants.GOODS_BR_ID_FIELD, String.valueOf(brand.getId()), Store.YES));
+		}
+		if (brand.getNameCn() != null) {
+			document.add(new TextField(SearchConstants.GOODS_BR_NAME_CN_FIELD, brand.getNameCn(), Store.YES));
+		}
+		if (brand.getNameEn() != null) {
+			document.add(new TextField(SearchConstants.GOODS_BR_NAME_EN_FIELD, brand.getNameEn(), Store.YES));
+		}
+		if (brand.getUuid() != null) {
+			document.add(new StringField(SearchConstants.GOODS_BR_UUID_FIELD, brand.getUuid(), Store.YES));
+		}
+		return document;
+	}
+
 	/**
 	 * OrderSimpleInfo对象转为Document
 	 * 
@@ -207,7 +289,7 @@ public class ObjectToDocumentUtils {
 				String.valueOf(order.getSellerEnterprise().getUu()), Store.YES));
 		document.add(new StringField(SearchConstants.ORDER_SELLERENNAME_FIELD, order.getSellerEnterprise().getEnName(),
 				Store.YES));
-		document.add(new LongField(SearchConstants.ORDER_CREATETIME_FIELD, order.getCreatetime().getTime(), Store.YES));
+		document.add(new LongField(SearchConstants.CREATETIME_FIELD, order.getCreatetime().getTime(), Store.YES));
 		document.add(new StringField(SearchConstants.ORDER_STATUS_FIELD, String.valueOf(order.getStatus()), Store.YES));
 		// 明细以json的格式存储
 		if (!CollectionUtils.isEmpty(order.getDetails())) {
@@ -244,8 +326,8 @@ public class ObjectToDocumentUtils {
 				String.valueOf(orderInvoice.getBuyerEnterprise().getUu()), Store.YES));
 		document.add(new StringField(SearchConstants.ORDER_INVOICE_BUYERENNAME_FIELD,
 				orderInvoice.getBuyerEnterprise().getEnName(), Store.YES));
-		document.add(new LongField(SearchConstants.ORDER_INVOICE_CREATETIME_FIELD,
-				orderInvoice.getCreatetime().getTime(), Store.YES));
+		document.add(
+				new LongField(SearchConstants.CREATETIME_FIELD, orderInvoice.getCreatetime().getTime(), Store.YES));
 		document.add(new StringField(SearchConstants.ORDER_INVOICE_STATUS_FIELD,
 				String.valueOf(orderInvoice.getStatus()), Store.YES));
 		if (!CollectionUtils.isEmpty(orderInvoice.getDetails())) {
@@ -275,8 +357,7 @@ public class ObjectToDocumentUtils {
 				String.valueOf(purchase.getSellerenuu()), Store.YES));
 		document.add(
 				new StringField(SearchConstants.PURCHASE_SELLERENNAME_FIELD, purchase.getSellerenname(), Store.YES));
-		document.add(new LongField(SearchConstants.PURCHASE_CREATETIME_FIELD, purchase.getCreatetime().getTime(),
-				Store.YES));
+		document.add(new LongField(SearchConstants.CREATETIME_FIELD, purchase.getCreatetime().getTime(), Store.YES));
 		document.add(new StringField(SearchConstants.PURCHASE_STATUS_FIELD, String.valueOf(purchase.getStatus()),
 				Store.YES));
 		if (!CollectionUtils.isEmpty(purchase.getDetails())) {
@@ -307,8 +388,8 @@ public class ObjectToDocumentUtils {
 				String.valueOf(purchaseInvoice.getSellerenuu()), Store.YES));
 		document.add(new StringField(SearchConstants.PURCHASE_INVOICE_SELLERENNAME_FIELD,
 				purchaseInvoice.getSellerenname(), Store.YES));
-		document.add(new LongField(SearchConstants.PURCHASE_INVOICE_CREATETIME_FIELD,
-				purchaseInvoice.getCreatetime().getTime(), Store.YES));
+		document.add(
+				new LongField(SearchConstants.CREATETIME_FIELD, purchaseInvoice.getCreatetime().getTime(), Store.YES));
 		document.add(new StringField(SearchConstants.PURCHASE_INVOICE_STATUS_FIELD,
 				String.valueOf(purchaseInvoice.getStatus()), Store.YES));
 		if (!CollectionUtils.isEmpty(purchaseInvoice.getDetails())) {

+ 26 - 14
search-console/src/main/java/com/uas/search/console/util/SearchConstants.java

@@ -43,6 +43,11 @@ public class SearchConstants {
 	 */
 	public static final String COMPONENT_TABLE_NAME = "product$component";
 
+	/**
+	 * 器件表名
+	 */
+	public static final String GOODS_TABLE_NAME = "v$product$cmpgoods";
+
 	/**
 	 * 商城销售订单表名
 	 */
@@ -63,16 +68,6 @@ public class SearchConstants {
 	 */
 	public static final String PURCHASE_INVOICE_TABLE_NAME = "trade$invoice_fmpu";
 
-	/**
-	 * 单据搜索时,若限定时间范围,可以键值对的形式传递参数,该键代表最小(远)时间
-	 */
-	public static final String MIN_TIME_KEY = "mintime";
-
-	/**
-	 * 单据搜索时,若限定时间范围,可以键值对的形式传递参数,该键代表最大(近)时间
-	 */
-	public static final String MAX_TIME_KEY = "maxtime";
-
 	// 类目索引字段的key
 	public static final String KIND_ID_FIELD = "ki_id";
 	public static final String KIND_NAMECN_FIELD = "ki_name_cn";
@@ -110,6 +105,26 @@ public class SearchConstants {
 	 */
 	public static final String COMPONENT_PROPERTY_TOKENIZED_SUFFIX = "_tokenized";
 
+	// 批次索引字段的key
+	public static final String GOODS_ID_FIELD = "id";
+	public static final String GOODS_GO_ID_FIELD = "go_id";
+	public static final String GOODS_GO_RESERVE_FIELD = "go_reserve";
+	public static final String GOODS_GO_MINPRICERMB_FIELD = "go_minpricermb";
+	public static final String GOODS_GO_MINPRICEUSD_FIELD = "go_minpriceusd";
+	public static final String GOODS_CRNAME_FIELD = "cr_name";
+	public static final String GOODS_ST_ID_FIELD = "store_id";
+	public static final String GOODS_ST_TYPE_FIELD = "store_type";
+	public static final String GOODS_CMP_ID_FIELD = "cmp_id";
+	public static final String GOODS_CMP_CODE_FIELD = "cmp_code";
+	public static final String GOODS_KI_ID_FIELD = "ki_id";
+	public static final String GOODS_KI_NAME_CN_FIELD = "ki_name_cn";
+	public static final String GOODS_KI_LEVEL_FIELD = "ki_level";
+	public static final String GOODS_KI_ISLEAF_FIELD = "ki_isleaf";
+	public static final String GOODS_BR_ID_FIELD = "br_id";
+	public static final String GOODS_BR_NAME_CN_FIELD = "br_name_cn";
+	public static final String GOODS_BR_NAME_EN_FIELD = "br_name_en";
+	public static final String GOODS_BR_UUID_FIELD = "br_uuid";
+
 	// 商城销售订单索引字段的key
 	/**
 	 * 对应销售单id(数据库id字段)
@@ -125,7 +140,6 @@ public class SearchConstants {
 	public static final String ORDER_BUYERENNAME_FIELD = "or_buyerenname";
 	public static final String ORDER_SELLERENUU_FIELD = "or_sellerenuu";
 	public static final String ORDER_SELLERENNAME_FIELD = "or_sellerenname";
-	public static final String ORDER_CREATETIME_FIELD = "or_createtime";
 	public static final String ORDER_STATUS_FIELD = "or_status";
 	public static final String ORDER_DETAILS_FIELD = "or_details";
 
@@ -142,7 +156,6 @@ public class SearchConstants {
 	public static final String ORDER_INVOICE_BUYERNAME_FIELD = "oi_buyername";
 	public static final String ORDER_INVOICE_BUYERENUU_FIELD = "oi_buyerenuu";
 	public static final String ORDER_INVOICE_BUYERENNAME_FIELD = "oi_buyerenname";
-	public static final String ORDER_INVOICE_CREATETIME_FIELD = "oi_createtime";
 	public static final String ORDER_INVOICE_STATUS_FIELD = "oi_status";
 	public static final String ORDER_INVOICE_DETAILS_FIELD = "oi_details";
 
@@ -157,7 +170,6 @@ public class SearchConstants {
 	public static final String PURCHASE_CODE_FIELD = "pu_code";
 	public static final String PURCHASE_SELLERENUU_FIELD = "pu_sellerenuu";
 	public static final String PURCHASE_SELLERENNAME_FIELD = "pu_sellerenname";
-	public static final String PURCHASE_CREATETIME_FIELD = "pu_createtime";
 	public static final String PURCHASE_STATUS_FIELD = "pu_status";
 	public static final String PURCHASE_DETAILS_FIELD = "pu_details";
 
@@ -172,8 +184,8 @@ public class SearchConstants {
 	public static final String PURCHASE_INVOICE_CODE_FIELD = "pi_code";
 	public static final String PURCHASE_INVOICE_SELLERENUU_FIELD = "pi_sellerenuu";
 	public static final String PURCHASE_INVOICE_SELLERENNAME_FIELD = "pi_sellerenname";
-	public static final String PURCHASE_INVOICE_CREATETIME_FIELD = "pi_createtime";
 	public static final String PURCHASE_INVOICE_STATUS_FIELD = "pi_status";
 	public static final String PURCHASE_INVOICE_DETAILS_FIELD = "pi_details";
 
+	public static final String CREATETIME_FIELD = "createtime";
 }

+ 1 - 0
search-console/src/main/java/com/uas/search/console/util/SearchUtils.java

@@ -272,6 +272,7 @@ public class SearchUtils {
 		tableNames.add(SearchConstants.KIND_TABLE_NAME);
 		tableNames.add(SearchConstants.BRAND_TABLE_NAME);
 		tableNames.add(SearchConstants.COMPONENT_TABLE_NAME);
+		tableNames.add(SearchConstants.GOODS_TABLE_NAME);
 		tableNames.add(SearchConstants.ORDER_TABLE_NAME);
 		tableNames.add(SearchConstants.ORDER_INVOICE_TABLE_NAME);
 		tableNames.add(SearchConstants.PURCHASE_TABLE_NAME);

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

@@ -19,6 +19,7 @@
 					<li>search/componentIds?keyword=a&page=1&size=5&filters={"kindId":401,"brandId":45,"reserve":true,"sample_qty":true,"original_qty":true,"inaction_stock_qty":true,"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><a target="_blank">search/goodsIds?keyword=aaa</a></li>
 				</ol>