Преглед изворни кода

索引实时更新:支持销售单及其明细表

sunyj пре 9 година
родитељ
комит
07b0b0e43c

+ 28 - 2
search-console/src/main/java/com/uas/search/console/controller/OrderSearchController.java

@@ -1,5 +1,6 @@
 package com.uas.search.console.controller;
 
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.HashMap;
 import java.util.List;
@@ -11,6 +12,7 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import com.uas.search.console.core.util.ContextUtils;
 import com.uas.search.console.dao.OrderDetailSimpleInfoDao;
 import com.uas.search.console.dao.OrderInvoiceDetailSimpleInfoDao;
 import com.uas.search.console.dao.OrderInvoiceSimpleInfoDao;
@@ -27,6 +29,7 @@ import com.uas.search.console.model.PurchaseDetailSimpleInfo;
 import com.uas.search.console.model.PurchaseInvoiceDetailSimpleInfo;
 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;
@@ -49,6 +52,9 @@ public class OrderSearchController {
 	@Autowired
 	private OrderSearchServiceImpl orderSearchService;
 
+	private InnerOrderSearchService innerOrderSearchService = ContextUtils.getApplicationContext()
+			.getBean("orderSearchServiceImpl", InnerOrderSearchService.class);
+
 	@Autowired
 	private OrderSimpleInfoDao orderDao;
 
@@ -139,8 +145,16 @@ public class OrderSearchController {
 
 	@RequestMapping("findAllOrders")
 	@ResponseBody
-	public List<OrderSimpleInfo> orders() {
-		return orderDao.findAll();
+	public List<OrderSimpleInfo> orders(String ids) {
+		if (StringUtils.isEmpty(ids)) {
+			return orderDao.findAll();
+		}
+		String[] strs = ids.split(",");
+		List<Long> longIds = new ArrayList<>();
+		for (String str : strs) {
+			longIds.add(Long.valueOf(str));
+		}
+		return orderDao.findAll(longIds);
 	}
 
 	@RequestMapping("findAllOrderDetails")
@@ -184,4 +198,16 @@ public class OrderSearchController {
 	public List<PurchaseInvoiceDetailSimpleInfo> purchaseInvoiceDetails() {
 		return purchaseInvoiceDetailDao.findAll();
 	}
+
+	@RequestMapping("/order")
+	@ResponseBody
+	public OrderSimpleInfo getOrder(Long id) {
+		return innerOrderSearchService.getOrder(id);
+	}
+
+	@RequestMapping("/orderDetail")
+	@ResponseBody
+	public OrderDetailSimpleInfo getOrderDetail(Long id) {
+		return innerOrderSearchService.getOrderDetail(id);
+	}
 }

+ 7 - 0
search-console/src/main/java/com/uas/search/console/dao/OrderDetailSimpleInfoDao.java

@@ -13,4 +13,11 @@ import com.uas.search.console.model.OrderDetailSimpleInfo;
 @Repository
 public interface OrderDetailSimpleInfoDao
 		extends JpaSpecificationExecutor<OrderDetailSimpleInfo>, JpaRepository<OrderDetailSimpleInfo, Long> {
+	/**
+	 * 根据id获取销售明细
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public OrderDetailSimpleInfo findById(Long id);
 }

+ 7 - 0
search-console/src/main/java/com/uas/search/console/dao/OrderSimpleInfoDao.java

@@ -13,4 +13,11 @@ import com.uas.search.console.model.OrderSimpleInfo;
 @Repository
 public interface OrderSimpleInfoDao
 		extends JpaSpecificationExecutor<OrderSimpleInfo>, JpaRepository<OrderSimpleInfo, Long> {
+	/**
+	 * 根据id获取销售单
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public OrderSimpleInfo findById(Long id);
 }

+ 171 - 1
search-console/src/main/java/com/uas/search/console/jms/QueueMessageParser.java

@@ -1,5 +1,10 @@
 package com.uas.search.console.jms;
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
@@ -10,10 +15,15 @@ import com.uas.search.console.core.util.ContextUtils;
 import com.uas.search.console.dao.BrandSimpleInfoDao;
 import com.uas.search.console.dao.ComponentSimpleInfoDao;
 import com.uas.search.console.dao.KindSimpleInfoDao;
+import com.uas.search.console.dao.OrderDetailSimpleInfoDao;
+import com.uas.search.console.dao.OrderSimpleInfoDao;
 import com.uas.search.console.model.BrandSimpleInfo;
 import com.uas.search.console.model.ComponentSimpleInfo;
 import com.uas.search.console.model.KindSimpleInfo;
+import com.uas.search.console.model.OrderDetailSimpleInfo;
+import com.uas.search.console.model.OrderSimpleInfo;
 import com.uas.search.console.model.ParsedQueueMessage;
+import com.uas.search.console.service.InnerOrderSearchService;
 import com.uas.search.console.service.InnerSearchService;
 import com.uas.search.console.util.SearchConstants;
 
@@ -35,9 +45,18 @@ public class QueueMessageParser {
 	@Autowired
 	private ComponentSimpleInfoDao componentDao;
 
+	@Autowired
+	private OrderSimpleInfoDao orderDao;
+
+	@Autowired
+	private OrderDetailSimpleInfoDao orderDetailDao;
+
 	private InnerSearchService innerSearchService = ContextUtils.getApplicationContext().getBean("searchServiceImpl",
 			InnerSearchService.class);
 
+	private InnerOrderSearchService innerOrderSearchService = ContextUtils.getApplicationContext()
+			.getBean("orderSearchServiceImpl", InnerOrderSearchService.class);
+
 	/**
 	 * 对得到的json消息进行解析
 	 * 
@@ -78,7 +97,28 @@ public class QueueMessageParser {
 			objects = parseBrand(jsonObject);
 		} else if (table.equals(SearchConstants.COMPONENT_TABLE_NAME)) {
 			objects = parseComponent(jsonObject);
-		} else {
+		} else if (table.equals(SearchConstants.ORDER_TABLE_NAME)) {
+			objects = parseOrder(jsonObject);
+		} else if (table.equals(SearchConstants.ORDER_DETAIL_TABLE_NAME)) {
+			objects = parseOrderDetail(jsonObject);
+		}
+		// else if (table.equals(SearchConstants.ORDER_INVOICE_TABLE_NAME)) {
+		// objects = parseOrderInvoice(jsonObject);
+		// }else if
+		// (table.equals(SearchConstants.ORDER_INVOICE_DETAIL_TABLE_NAME)) {
+		// objects = parseOrderDetailInvoice(jsonObject);
+		// }else if (table.equals(SearchConstants.PURCHASE_TABLE_NAME)) {
+		// objects = parsePurchase(jsonObject);
+		// }else if (table.equals(SearchConstants.PURCHASE_DETAIL_TABLE_NAME)) {
+		// objects = parsePurchaseDetail(jsonObject);
+		// }else if (table.equals(SearchConstants.PURCHASE_INVOICE_TABLE_NAME))
+		// {
+		// objects = parsePurchaseInvoice(jsonObject);
+		// }else if
+		// (table.equals(SearchConstants.PURCHASE_INVOICE_DETAIL_TABLE_NAME)) {
+		// objects = parsePurchaseDetailInvoice(jsonObject);
+		// }
+		else {
 			return null;
 		}
 
@@ -200,4 +240,134 @@ public class QueueMessageParser {
 		}
 		return components;
 	}
+
+	/**
+	 * 对order销售单进行解析
+	 * 
+	 * @param jsonObject
+	 * @return order销售单对象数组
+	 * @throws JSONException
+	 */
+	// {"method":"insert","table":"trade$order","ids":[124]}
+	private OrderSimpleInfo[] parseOrder(JSONObject jsonObject) throws JSONException {
+		Object[] ids = jsonObject.getJSONArray("ids").toArray();
+		OrderSimpleInfo[] orders = new OrderSimpleInfo[ids.length];
+		for (int i = 0; i < ids.length; i++) {
+			Long id = Long.parseLong(ids[i].toString());
+			OrderSimpleInfo order = orderDao.findById(id);
+			OrderSimpleInfo localOrder = innerOrderSearchService.getOrder(id);
+			// 删除操作
+			if (jsonObject.getString("method").equals("delete")) {
+				if (order != null) {
+					// 删除之后,数据还存在,并且与本地索引数据一样,说明是进行了回退,或者重新插入了相同的数据,不对索引进行更新
+					if (localOrder == null || localOrder.equals(order)) {
+						order = null;
+					}
+				} else {
+					order = new OrderSimpleInfo();
+					order.setId(id);
+				}
+			}
+			// 更新或者插入操作
+			else {
+				// 本地有相同的数据,不更新索引
+				if (localOrder != null && localOrder.equals(order)) {
+					order = null;
+				}
+			}
+			orders[i] = order;
+		}
+		return orders;
+	}
+
+	/**
+	 * 对销售单明细进行解析
+	 * 
+	 * @param jsonObject
+	 * @return 销售单对象数组
+	 * @throws JSONException
+	 */
+	// {"method":"insert","table":"trade$order_detail","ids":[124]}
+	private OrderDetailSimpleInfo[] parseOrderDetail(JSONObject jsonObject) throws JSONException {
+		Object[] ids = jsonObject.getJSONArray("ids").toArray();
+		OrderDetailSimpleInfo[] orderDetails = new OrderDetailSimpleInfo[ids.length];
+		for (int i = 0; i < ids.length; i++) {
+			Long id = Long.parseLong(ids[i].toString());
+			OrderDetailSimpleInfo orderDetail = orderDetailDao.findById(id);
+			OrderDetailSimpleInfo localOrderDetail = innerOrderSearchService.getOrderDetail(id);
+			// 删除操作
+			if (jsonObject.getString("method").equals("delete")) {
+				if (orderDetail != null) {
+					// 删除之后,数据还存在,并且与本地索引数据一样,说明是进行了回退,或者重新插入了相同的数据,不对索引进行更新
+					if (localOrderDetail == null || localOrderDetail.equals(orderDetail)) {
+						orderDetail = null;
+					}
+				} else {
+					orderDetail = new OrderDetailSimpleInfo();
+					orderDetail.setId(id);
+				}
+			}
+			// 更新或者插入操作
+			else {
+				// 本地有相同的数据,不更新索引
+				if (localOrderDetail != null && localOrderDetail.equals(orderDetail)) {
+					orderDetail = null;
+				}
+			}
+			orderDetails[i] = orderDetail;
+		}
+		return orderDetails;
+	}
+
+	private OrderSimpleInfo[] parseOrder2(JSONObject jsonObject) throws JSONException {
+		HashSet<Long> ids = parseIds(jsonObject);
+		// 一次性从数据库获取同一次批处理下ids中对应的所有数据(删除操作,数据可能为空)
+		List<OrderSimpleInfo> orderList = orderDao.findAll(ids);
+		System.out.println("orderList: " + orderList.size() + " " + orderList);
+		for (int i = 0; i < orderList.size(); i++) {
+			OrderSimpleInfo order = orderList.get(i);
+			Long id = order.getId();
+			System.out.println("id " + id);
+			OrderSimpleInfo localOrder = innerOrderSearchService.getOrder(id);
+			System.out.println("localOrder " + localOrder);
+			// 删除操作
+			if (jsonObject.getString("method").equals("delete")) {
+				// 删除之后,数据还存在,说明是进行了回退,或者重新插入了相同的数据,不对索引进行更新
+				if (localOrder == null || localOrder.equals(order)) {
+					orderList.remove(i);
+					i--;
+				}
+			}
+			// 更新或者插入操作
+			else {
+				// 本地有相同的数据,不更新索引
+				if (localOrder != null && localOrder.equals(order)) {
+					orderList.remove(i);
+					i--;
+				}
+			}
+		}
+		System.out.println("removed orderList: " + orderList.size() + " " + orderList);
+		if (CollectionUtils.isEmpty(orderList)) {
+			return null;
+		}
+		OrderSimpleInfo[] orders = new OrderSimpleInfo[orderList.size()];
+		orderList.toArray(orders);
+		System.out.println("orders: " + orders.length + " " + orders);
+		return orders;
+	}
+
+	private HashSet<Long> parseIds(JSONObject jsonObject) {
+		System.out.println("-------------------------------------");
+		Object[] objectIds = jsonObject.getJSONArray("ids").toArray();
+		System.out.println("objectIds: " + objectIds.length + " " + Arrays.toString(objectIds));
+		// 先去重
+		HashSet<Long> hashSetIds = new HashSet<>();
+		for (Object objectId : objectIds) {
+			Long longId = Long.valueOf(objectId.toString());
+			hashSetIds.add(longId);
+		}
+		System.out.println("hashSetIds: " + hashSetIds.size() + " " + hashSetIds);
+		return hashSetIds;
+	}
 }

+ 10 - 0
search-console/src/main/java/com/uas/search/console/model/EnterpriseSimpleInfo.java

@@ -3,6 +3,7 @@
 package com.uas.search.console.model;
 
 import java.io.Serializable;
+import java.util.Objects;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -50,6 +51,15 @@ public class EnterpriseSimpleInfo implements Serializable {
 		this.enName = enName;
 	}
 
+	public boolean equals(Object otherObject) {
+		if (this == otherObject || otherObject == null || getClass() != otherObject.getClass()
+				|| !(otherObject instanceof EnterpriseSimpleInfo)) {
+			return true;
+		}
+		EnterpriseSimpleInfo other = (EnterpriseSimpleInfo) otherObject;
+		return Objects.equals(uu, other.getUu()) && Objects.equals(enName, other.getEnName());
+	}
+
 	@Override
 	public String toString() {
 		return "EnterpriseSimpleInfo [uu=" + uu + ", enName=" + enName + "]";

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

@@ -1,5 +1,7 @@
 package com.uas.search.console.model;
 
+import java.util.Objects;
+
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -111,6 +113,18 @@ public class OrderDetailSimpleInfo {
 		this.brName = brName;
 	}
 
+	public boolean equals(Object otherObject) {
+		if (this == otherObject || otherObject == null || getClass() != otherObject.getClass()
+				|| !(otherObject instanceof OrderSimpleInfo)) {
+			return true;
+		}
+		OrderDetailSimpleInfo other = (OrderDetailSimpleInfo) otherObject;
+		return Objects.equals(id, other.getId()) && Objects.equals(code, other.getCode())
+				&& Objects.equals(orderid, other.getOrderid()) && Objects.equals(detno, other.getDetno())
+				&& Objects.equals(cmpCode, other.getCmpCode()) && Objects.equals(kiName, other.getKiName())
+				&& Objects.equals(brName, other.getBrName());
+	}
+
 	@Override
 	public String toString() {
 		return "OrderDetailSimpleInfo [id=" + id + ", orderid=" + orderid + ", detno=" + detno + ", code=" + code

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

@@ -2,6 +2,7 @@ package com.uas.search.console.model;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.Objects;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -126,6 +127,19 @@ public class OrderSimpleInfo implements Serializable {
 		this.createtime = createtime;
 	}
 
+	public boolean equals(Object otherObject) {
+		if (this == otherObject || otherObject == null || getClass() != otherObject.getClass()
+				|| !(otherObject instanceof OrderSimpleInfo)) {
+			return true;
+		}
+		OrderSimpleInfo other = (OrderSimpleInfo) otherObject;
+		return Objects.equals(id, other.getId()) && Objects.equals(code, other.getCode())
+				&& Objects.equals(buyeruu, other.getBuyeruu()) && Objects.equals(buyername, other.getBuyername())
+				&& Objects.equals(buyerEnterprise, other.getBuyerEnterprise())
+				&& Objects.equals(sellerEnterprise, other.getSellerEnterprise())
+				&& Objects.equals(createtime, other.getCreatetime());
+	}
+
 	@Override
 	public String toString() {
 		return "OrderSimpleInfo [id=" + id + ", code=" + code + ", buyeruu=" + buyeruu + ", buyername=" + buyername

+ 18 - 0
search-console/src/main/java/com/uas/search/console/service/InnerOrderSearchService.java

@@ -1,5 +1,7 @@
 package com.uas.search.console.service;
 
+import com.uas.search.console.model.OrderDetailSimpleInfo;
+import com.uas.search.console.model.OrderSimpleInfo;
 import com.uas.search.model.BaseOrder;
 import com.uas.search.model.PageParams;
 import com.uas.search.model.SPage;
@@ -68,4 +70,20 @@ public interface InnerOrderSearchService {
 	 *         如果都没有命中,则不命中。
 	 */
 	public SPage<BaseOrder> searchPurchaseInvoiceIds(String keyword, PageParams params);
+
+	/**
+	 * 根据id获取索引中的销售单数据
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public OrderSimpleInfo getOrder(Long id);
+
+	/**
+	 * 根据id获取索引中的销售单明细数据
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public OrderDetailSimpleInfo getOrderDetail(Long id);
 }

+ 16 - 0
search-console/src/main/java/com/uas/search/console/service/impl/IndexServiceImpl.java

@@ -591,6 +591,16 @@ public class IndexServiceImpl implements IndexService {
 				if (document != null) {
 					indexWriter.addDocument(document);
 				}
+			} else if (obj instanceof OrderSimpleInfo) {
+				Document document = ObjectToDocumentUtils.toDocument((OrderSimpleInfo) obj);
+				if (document != null) {
+					indexWriter.addDocument(document);
+				}
+			} else if (obj instanceof OrderDetailSimpleInfo) {
+				Document document = ObjectToDocumentUtils.toDocument((OrderDetailSimpleInfo) obj);
+				if (document != null) {
+					indexWriter.addDocument(document);
+				}
 			} else {
 				logger.error("Message parsing failed!");
 			}
@@ -663,6 +673,12 @@ public class IndexServiceImpl implements IndexService {
 			} else if (obj instanceof ComponentSimpleInfo) {
 				indexWriter.deleteDocuments(
 						new Term(SearchConstants.COMPONENT_ID_FIELD, ((ComponentSimpleInfo) obj).getId().toString()));
+			} else if (obj instanceof OrderSimpleInfo) {
+				indexWriter.deleteDocuments(
+						new Term(SearchConstants.ORDER_ID_FIELD, ((OrderSimpleInfo) obj).getId().toString()));
+			} else if (obj instanceof OrderDetailSimpleInfo) {
+				indexWriter.deleteDocuments(new Term(SearchConstants.ORDER_DETAIL_ID_FIELD,
+						((OrderDetailSimpleInfo) obj).getId().toString()));
 			} else {
 				logger.error("Message parsing failed!");
 			}

+ 45 - 53
search-console/src/main/java/com/uas/search/console/service/impl/OrderSearchServiceImpl.java

@@ -23,8 +23,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
+import com.uas.search.console.model.EnterpriseSimpleInfo;
+import com.uas.search.console.model.OrderDetailSimpleInfo;
+import com.uas.search.console.model.OrderSimpleInfo;
 import com.uas.search.console.service.InnerOrderSearchService;
-import com.uas.search.console.support.IndexSearcherManager;
 import com.uas.search.console.util.OrderSearchUtils;
 import com.uas.search.console.util.SearchConstants;
 import com.uas.search.console.util.SearchUtils;
@@ -44,10 +46,6 @@ import com.uas.search.utils.OrderSearchConstants;
  */
 @Service
 public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSearchService {
-	/**
-	 * 默认搜索的最大的记录条数
-	 */
-	private static final int TOP_NUM = 1024 * 1024 * 1024;
 
 	/**
 	 * 默认的页码
@@ -59,8 +57,6 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 	 */
 	private static final int PAGE_SIZE = 20;
 
-	private static IndexSearcherManager searcherManager = new IndexSearcherManager();
-
 	private Logger logger = Logger.getLogger(getClass());
 
 	@Override
@@ -79,7 +75,6 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 
 	@Override
 	public SPage<BaseOrder> searchOrderIds(String keyword, PageParams params) {
-		logger.info("main");
 		return searchMainTable(keyword, params, SearchConstants.ORDER_TABLE_NAME);
 	}
 
@@ -113,7 +108,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 		if (SearchUtils.isKeywordInvalid(keyword)) {
 			throw new SearchException("搜索关键词无效:" + keyword);
 		}
-		IndexSearcher indexSearcher = getIndexSearcher();
+		IndexSearcher indexSearcher = SearchUtils.getIndexSearcher();
 		// 获取该表keyword可以搜索的域
 		List<String> keywordFields = OrderSearchUtils.getKeywordFields(tableName);
 
@@ -203,7 +198,6 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 				TopDocs previousTopDocs = indexSearcher.search(booleanQuery, (sPage.getPage() - 1) * sPage.getSize());
 				int totalHits = previousTopDocs.totalHits;
 				ScoreDoc[] previousScoreDocs = previousTopDocs.scoreDocs;
-				logger.info(previousScoreDocs == null || previousScoreDocs.length == 0);
 				// 如果主表中未匹配到结果,再搜索其明细表
 				if (totalHits == 0) {
 					return searchDetailTable(keyword, params, OrderSearchUtils.getDetailTableName(tableName));
@@ -247,7 +241,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 		} catch (NumberFormatException | IOException e) {
 			throw new SearchException(e).setDetailedMessage(e);
 		} finally {
-			searcherManager.release(indexSearcher);
+			SearchUtils.releaseIndexSearcher(indexSearcher);
 		}
 		return sPage;
 	}
@@ -267,7 +261,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 		if (SearchUtils.isKeywordInvalid(keyword)) {
 			throw new SearchException("搜索关键词无效:" + keyword);
 		}
-		IndexSearcher indexSearcher = getIndexSearcher();
+		IndexSearcher indexSearcher = SearchUtils.getIndexSearcher();
 		List<String> keywordFields = OrderSearchUtils.getKeywordFields(tableName);
 
 		SPage<BaseOrder> sPage = new SPage<>();
@@ -366,7 +360,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 		} catch (NumberFormatException | IOException e) {
 			throw new SearchException(e).setDetailedMessage(e);
 		} finally {
-			searcherManager.release(indexSearcher);
+			SearchUtils.releaseIndexSearcher(indexSearcher);
 		}
 		return sPage;
 	}
@@ -384,7 +378,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 		if (id == null) {
 			return null;
 		}
-		List<Document> documents = getDocuments(OrderSearchUtils.getDetailTableForeignIdField(tableName),
+		List<Document> documents = SearchUtils.getDocuments(OrderSearchUtils.getDetailTableForeignIdField(tableName),
 				id.toString());
 		List<BaseOrderDetail> baseOrderDetails = new ArrayList<>();
 		for (Document document : documents) {
@@ -417,7 +411,8 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 			BaseOrder baseOrder = new BaseOrder();
 			List<BaseOrderDetail> baseOrderDetails = map.get(key);
 			baseOrder.setDetails(baseOrderDetails);
-			List<Document> documents = getDocuments(OrderSearchUtils.getIdField(tableName), Long.toString(key));
+			List<Document> documents = SearchUtils.getDocuments(OrderSearchUtils.getIdField(tableName),
+					Long.toString(key));
 			if (CollectionUtils.isEmpty(documents)) {
 				logger.error("明细表中外键" + key + "对应的主表索引不存在");
 				continue;
@@ -436,48 +431,45 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 		return baseOrders;
 	}
 
-	/**
-	 * 获取IndexSearcher对象,若为空,抛出异常
-	 * 
-	 * @return IndexSearcher对象
-	 */
-	private IndexSearcher getIndexSearcher() {
-		searcherManager.maybeReopen();
-		IndexSearcher indexSearcher = searcherManager.get();
-		if (indexSearcher == null) {
-			throw new SearchException("获取索引文件失败");
+	@Override
+	public OrderSimpleInfo getOrder(Long id) {
+		OrderSimpleInfo order = null;
+		Document document = SearchUtils.getDocumentById(SearchConstants.ORDER_ID_FIELD, id);
+		if (document != null) {
+			order = new OrderSimpleInfo();
+			order.setId(id);
+			order.setCode(document.get(SearchConstants.ORDER_CODE_FIELD));
+			order.setBuyeruu(Long.valueOf(document.get(SearchConstants.ORDER_BUYERUU_FIELD)));
+			order.setBuyername(document.get(SearchConstants.ORDER_BUYERNAME_FIELD));
+			EnterpriseSimpleInfo buyerEnterprise = new EnterpriseSimpleInfo();
+			buyerEnterprise.setUu(Long.valueOf(document.get(SearchConstants.ORDER_BUYERENUU_FIELD)));
+			buyerEnterprise.setEnName(document.get(SearchConstants.ORDER_BUYERENNAME_FIELD));
+			order.setBuyerEnterprise(buyerEnterprise);
+			EnterpriseSimpleInfo sellerEnterprise = new EnterpriseSimpleInfo();
+			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)));
+			order.setCreatetime(createtime);
 		}
-		return indexSearcher;
+		return order;
 	}
 
-	/**
-	 * 根据域和搜索词获取Document列表
-	 * 
-	 * @param field
-	 *            搜索域
-	 * @param keyword
-	 *            搜索词
-	 * @return Document列表
-	 */
-	private List<Document> getDocuments(String field, String keyword) {
-		if (StringUtils.isEmpty(field) || StringUtils.isEmpty(keyword)) {
-			throw new SearchException("搜索的域和搜索词不能为空");
-		}
-		IndexSearcher indexSearcher = getIndexSearcher();
-		List<Document> documents = new ArrayList<>();
-		TermQuery termQuery = new TermQuery(new Term(field, String.valueOf(keyword)));
-		try {
-			TopDocs topDocs = indexSearcher.search(termQuery, TOP_NUM);
-			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
-			for (ScoreDoc scoreDoc : scoreDocs) {
-				documents.add(indexSearcher.doc(scoreDoc.doc));
-			}
-		} catch (IOException e) {
-			throw new SearchException(e);
-		} finally {
-			searcherManager.release(indexSearcher);
+	@Override
+	public OrderDetailSimpleInfo getOrderDetail(Long id) {
+		OrderDetailSimpleInfo orderDetail = null;
+		Document document = SearchUtils.getDocumentById(SearchConstants.ORDER_DETAIL_ID_FIELD, id);
+		if (document != null) {
+			orderDetail = new OrderDetailSimpleInfo();
+			orderDetail.setId(id);
+			orderDetail.setCode(document.get(SearchConstants.ORDER_DETAIL_CODE_FIELD));
+			orderDetail.setOrderid(Long.valueOf(document.get(SearchConstants.ORDER_DETAIL_ORDERID_FIELD)));
+			orderDetail.setDetno(Short.valueOf(document.get(SearchConstants.ORDER_DETAIL_DETNO_FIELD)));
+			orderDetail.setCmpCode(document.get(SearchConstants.ORDER_DETAIL_COMPONENTCODE_FIELD));
+			orderDetail.setKiName(document.get(SearchConstants.ORDER_DETAIL_KINDNAME_FIELD));
+			orderDetail.setBrName(document.get(SearchConstants.ORDER_DETAIL_BRANDNAME_FIELD));
 		}
-		return documents;
+		return orderDetail;
 	}
 
 }

+ 8 - 0
search-console/src/main/java/com/uas/search/console/util/ObjectToDocumentUtils.java

@@ -112,6 +112,8 @@ public class ObjectToDocumentUtils {
 		document.add(new TextField(SearchConstants.ORDER_DETAIL_CODE_FIELD, orderDetail.getCode(), Store.YES));
 		document.add(new StringField(SearchConstants.ORDER_DETAIL_ORDERID_FIELD,
 				String.valueOf(orderDetail.getOrderid()), Store.YES));
+		document.add(new StringField(SearchConstants.ORDER_DETAIL_DETNO_FIELD, String.valueOf(orderDetail.getDetno()),
+				Store.YES));
 		document.add(
 				new TextField(SearchConstants.ORDER_DETAIL_COMPONENTCODE_FIELD, orderDetail.getCmpCode(), Store.YES));
 		document.add(new TextField(SearchConstants.ORDER_DETAIL_KINDNAME_FIELD, orderDetail.getKiName(), Store.YES));
@@ -173,6 +175,8 @@ public class ObjectToDocumentUtils {
 				Store.YES));
 		document.add(new StringField(SearchConstants.ORDER_INVOICE_DETAIL_INVOICEID_FIELD,
 				String.valueOf(orderInvoiceDetail.getInvoiceid()), Store.YES));
+		document.add(new StringField(SearchConstants.ORDER_INVOICE_DETAIL_DETNO_FIELD,
+				String.valueOf(orderInvoiceDetail.getDetno()), Store.YES));
 		document.add(new TextField(SearchConstants.ORDER_INVOICE_DETAIL_COMPONENTCODE_FIELD,
 				orderInvoiceDetail.getCmpCode(), Store.YES));
 		document.add(new TextField(SearchConstants.ORDER_INVOICE_DETAIL_KINDNAME_FIELD, orderInvoiceDetail.getKiName(),
@@ -225,6 +229,8 @@ public class ObjectToDocumentUtils {
 		document.add(new TextField(SearchConstants.PURCHASE_DETAIL_CODE_FIELD, purchaseDetail.getCode(), Store.YES));
 		document.add(new StringField(SearchConstants.PURCHASE_DETAIL_PURCHASEID_FIELD,
 				String.valueOf(purchaseDetail.getPurchaseid()), Store.YES));
+		document.add(new StringField(SearchConstants.PURCHASE_DETAIL_DETNO_FIELD,
+				String.valueOf(purchaseDetail.getDetno()), Store.YES));
 		document.add(new TextField(SearchConstants.PURCHASE_DETAIL_COMPONENTCODE_FIELD, purchaseDetail.getCmpCode(),
 				Store.YES));
 		document.add(
@@ -282,6 +288,8 @@ public class ObjectToDocumentUtils {
 				Store.YES));
 		document.add(new StringField(SearchConstants.PURCHASE_INVOICE_DETAIL_INVOICEID_FIELD,
 				String.valueOf(purchaseInvoiceDetail.getInvoiceid()), Store.YES));
+		document.add(new StringField(SearchConstants.PURCHASE_INVOICE_DETAIL_DETNO_FIELD,
+				String.valueOf(purchaseInvoiceDetail.getDetno()), Store.YES));
 		document.add(new TextField(SearchConstants.PURCHASE_INVOICE_DETAIL_COMPONENTCODE_FIELD,
 				purchaseInvoiceDetail.getCmpCode(), Store.YES));
 		document.add(new TextField(SearchConstants.PURCHASE_INVOICE_DETAIL_KINDNAME_FIELD,

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

@@ -118,7 +118,7 @@ public class SearchUtils {
 		if (id == null) {
 			throw new SearchException("输入无效:" + id);
 		}
-		List<Document> documents = getDocuments(field, Long.toString(id), 1);
+		List<Document> documents = getDocuments(field, Long.toString(id));
 		if (CollectionUtils.isEmpty(documents)) {
 			return null;
 		} else if (documents.size() > 1) {