Bladeren bron

精简单据搜索代码

sunyj 9 jaren geleden
bovenliggende
commit
52b4b7f90d

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

@@ -74,44 +74,12 @@ public class OrderSearchController {
 
 	@RequestMapping("orderIds")
 	@ResponseBody
-	public SPage<BaseOrder> getOrderIdsWithDetail(String keyword, String tableName, Integer page, Integer size, Long buyeruu, Long buyerenuu,
-			Long sellerenuu, String mintime, String maxtime) {
+	public SPage<BaseOrder> getOrderIdsWithDetail(String keyword, String tableName, Integer page, Integer size, String mintime, String maxtime) {
 		Table_name tbName = null;
 		if (!StringUtils.isEmpty(tableName)) {
 			tbName = Table_name.valueOf(tableName);
 		}
-		
-		PageParams params = new PageParams();
-		if (page != null) {
-			params.setPage(page);
-		}
-		if (size != null) {
-			params.setSize(size);
-		}
-		Map<String, Object> filters = new HashMap<>();
-		if (buyeruu != null) {
-			filters.put("or_buyeruu", buyeruu);
-		}
-		if (buyerenuu != null) {
-			filters.put("or_buyerenuu", buyerenuu);
-		}
-		if (sellerenuu != null) {
-			filters.put("or_sellerenuu", sellerenuu);
-		}
-		if (mintime != null) {
-			filters.put(SearchConstants.MIN_TIME_KEY, parseTime(mintime));
-		}
-		if (maxtime != null) {
-			filters.put(SearchConstants.MAX_TIME_KEY, parseTime(maxtime));
-		}
-		params.setFilters(filters);
-		return orderSearchService.getOrderIdsWithDetail(keyword, tbName, params);
-	}
 
-	@RequestMapping("orders")
-	@ResponseBody
-	public SPage<BaseOrder> searchOrderIds(String keyword, Integer page, Integer size, Long buyeruu, Long buyerenuu,
-			Long sellerenuu, String mintime, String maxtime) {
 		PageParams params = new PageParams();
 		if (page != null) {
 			params.setPage(page);
@@ -120,15 +88,6 @@ public class OrderSearchController {
 			params.setSize(size);
 		}
 		Map<String, Object> filters = new HashMap<>();
-		if (buyeruu != null) {
-			filters.put("or_buyeruu", buyeruu);
-		}
-		if (buyerenuu != null) {
-			filters.put("or_buyerenuu", buyerenuu);
-		}
-		if (sellerenuu != null) {
-			filters.put("or_sellerenuu", sellerenuu);
-		}
 		if (mintime != null) {
 			filters.put(SearchConstants.MIN_TIME_KEY, parseTime(mintime));
 		}
@@ -136,20 +95,7 @@ public class OrderSearchController {
 			filters.put(SearchConstants.MAX_TIME_KEY, parseTime(maxtime));
 		}
 		params.setFilters(filters);
-		return orderSearchService.searchOrderIds(keyword, params);
-	}
-
-	@RequestMapping("orderDetails")
-	@ResponseBody
-	public SPage<BaseOrder> searchOrderDetailIds(String keyword, Integer page, Integer size) {
-		PageParams params = new PageParams();
-		if (page != null) {
-			params.setPage(page);
-		}
-		if (size != null) {
-			params.setSize(size);
-		}
-		return orderSearchService.searchOrderDetailIds(keyword, params);
+		return orderSearchService.getOrderIdsWithDetail(keyword, tbName, params);
 	}
 
 	/**

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

@@ -27,19 +27,6 @@ public interface InnerOrderSearchService {
 	 */
 	public SPage<BaseOrder> searchOrderIds(String keyword, PageParams params);
 
-	/**
-	 * 根据关键词搜索销售单明细id信息
-	 * 
-	 * @param keyword
-	 *            关键词,可以是:单号、器件型号、 器件品牌名称、器件类目名称
-	 * @param params
-	 *            其他信息,可能带有翻页信息
-	 * @return 符合条件的单据。<br>
-	 *         如果关键词命中了从表中的信息,结果有主表带被命中的从表信息;<br>
-	 *         如果都没有命中,则不命中。
-	 */
-	public SPage<BaseOrder> searchOrderDetailIds(String keyword, PageParams params);
-
 	/**
 	 * 根据关键词和其他信息搜索销售发货单id信息
 	 * 

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

@@ -89,7 +89,6 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 
 	@Override
 	public SPage<BaseOrder> searchPurchaseIds(String keyword, PageParams params) {
-		// TODO Auto-generated method stub
 		return searchMainTable(keyword, params, SearchConstants.PURCHASE_TABLE_NAME);
 	}
 
@@ -98,369 +97,6 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 		return searchMainTable(keyword, params, SearchConstants.PURCHASE_INVOICE_TABLE_NAME);
 	}
 
-	public SPage<BaseOrder> searchOrder2Ids(String keyword, PageParams params) {
-		if (SearchUtils.isKeywordInvalid(keyword)) {
-			throw new SearchException("搜索关键词无效:" + keyword);
-		}
-		IndexSearcher indexSearcher = getIndexSearcher();
-		SPage<BaseOrder> sPage = new SPage<>();
-		BooleanQuery booleanQuery = new BooleanQuery();
-
-		// 关键词带空格,进行与操作
-		String[] strs = keyword.split(" ");
-		for (String str : strs) {
-			// 单号、买房名称、买方企业名称、卖方企业名称
-			BooleanQuery booleanQuery2 = new BooleanQuery();
-			booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_CODE_FIELD, str),
-					BooleanClause.Occur.SHOULD);
-			booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_BUYERNAME_FIELD, str),
-					BooleanClause.Occur.SHOULD);
-			booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_BUYERENNAME_FIELD, str),
-					BooleanClause.Occur.SHOULD);
-			booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_SELLERENNAME_FIELD, str),
-					BooleanClause.Occur.SHOULD);
-			booleanQuery.add(booleanQuery2, BooleanClause.Occur.MUST);
-		}
-
-		// 分页信息
-		if (params == null) {
-			sPage.setPage(PAGE_INDEX);
-			sPage.setSize(PAGE_SIZE);
-			sPage.setFirst(true);
-		} else {
-			int page = params.getPage();
-			if (page > 0) {
-				sPage.setPage(page);
-			} else {
-				sPage.setPage(PAGE_INDEX);
-				sPage.setFirst(true);
-			}
-			int size = params.getSize();
-			if (size > 0) {
-				sPage.setSize(size);
-			} else {
-				sPage.setSize(PAGE_SIZE);
-			}
-
-			// 买方uu、买方企业uu、卖方企业uu、日期范围
-			Map<String, Object> filters = params.getFilters();
-			if (!CollectionUtils.isEmpty(filters)) {
-				if (!StringUtils.isEmpty(filters.get("or_buyeruu"))) {
-					booleanQuery.add(new TermQuery(
-							new Term(SearchConstants.ORDER_BUYERUU_FIELD, filters.get("or_buyeruu").toString())),
-							BooleanClause.Occur.MUST);
-				}
-				if (!StringUtils.isEmpty(filters.get("or_buyerenuu"))) {
-					booleanQuery.add(new TermQuery(
-							new Term(SearchConstants.ORDER_BUYERENUU_FIELD, filters.get("or_buyerenuu").toString())),
-							BooleanClause.Occur.MUST);
-				}
-				if (!StringUtils.isEmpty(filters.get("or_sellerenuu"))) {
-					booleanQuery.add(new TermQuery(
-							new Term(SearchConstants.ORDER_SELLERENUU_FIELD, filters.get("or_sellerenuu").toString())),
-							BooleanClause.Occur.MUST);
-				}
-				if (!StringUtils.isEmpty(filters.get(SearchConstants.MIN_TIME_KEY))
-						|| !StringUtils.isEmpty(filters.get(SearchConstants.MAX_TIME_KEY))) {
-					// 最小日期初始化为2016.1.1
-					Calendar calendar = Calendar.getInstance();
-					calendar.set(2016, 0, 1);
-					// 最大日期初始化为现在
-					long minTime = calendar.getTimeInMillis();
-					long maxTime = new Date().getTime();
-					if (!StringUtils.isEmpty(filters.get(SearchConstants.MIN_TIME_KEY))) {
-						minTime = Long.parseLong(filters.get(SearchConstants.MIN_TIME_KEY).toString());
-						logger.info("--" + minTime);
-					}
-					if (!StringUtils.isEmpty(filters.get(SearchConstants.MAX_TIME_KEY))) {
-						maxTime = Long.parseLong(filters.get(SearchConstants.MAX_TIME_KEY).toString());
-						logger.info("--" + maxTime);
-					}
-					booleanQuery.add(NumericRangeQuery.newLongRange(SearchConstants.ORDER_CREATETIME_FIELD, minTime,
-							maxTime, true, true), BooleanClause.Occur.MUST);
-					logger.info(minTime);
-					logger.info(maxTime);
-					logger.info(new Date(minTime));
-					logger.info(new Date(maxTime));
-				}
-			}
-		}
-		logger.info(booleanQuery);
-
-		try {
-			TopDocs topDocs;
-			// 如果页码不为1
-			if (sPage.getPage() > 1) {
-				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 searchOrderDetailIds(keyword, params);
-				} else {
-					if ((sPage.getPage() - 1) * sPage.getSize() >= totalHits) {
-						throw new SearchException("页码过大:元素总数量为" + totalHits);
-					}
-					topDocs = indexSearcher.searchAfter(previousScoreDocs[previousScoreDocs.length - 1], booleanQuery,
-							sPage.getSize());
-				}
-			} else {
-				sPage.setFirst(true);
-				topDocs = indexSearcher.search(booleanQuery, sPage.getSize());
-			}
-			// 如果主表中未匹配到结果,再搜索其明细表
-			int totalHits = topDocs.totalHits;
-			if (totalHits < 1) {
-				return searchOrderDetailIds(keyword, params);
-			}
-
-			sPage.setTotalElement(totalHits);
-			int totalPage = (int) Math.ceil(totalHits / (1.0 * sPage.getSize()));
-			sPage.setTotalPage(totalPage);
-			if (totalPage == sPage.getPage()) {
-				sPage.setLast(true);
-			}
-
-			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
-			List<BaseOrder> baseOrders = new ArrayList<>();
-			for (ScoreDoc scoreDoc : scoreDocs) {
-				Document document = indexSearcher.doc(scoreDoc.doc);
-				Long id = Long.valueOf(document.get(SearchConstants.ORDER_ID_FIELD));
-				String code = document.get(SearchConstants.ORDER_CODE_FIELD);
-				BaseOrder baseOrder = new BaseOrder(id, code);
-				baseOrder.setDetails(getOrderDetails(id));
-				baseOrders.add(baseOrder);
-			}
-			sPage.setContent(baseOrders);
-		} catch (NumberFormatException | IOException e) {
-			throw new SearchException(e).setDetailedMessage(e);
-		} finally {
-			searcherManager.release(indexSearcher);
-		}
-		return sPage;
-	}
-
-	@Override
-	public SPage<BaseOrder> searchOrderDetailIds(String keyword, PageParams params) {
-		if (SearchUtils.isKeywordInvalid(keyword)) {
-			throw new SearchException("搜索关键词无效:" + keyword);
-		}
-		IndexSearcher indexSearcher = getIndexSearcher();
-		SPage<BaseOrder> sPage = new SPage<>();
-		BooleanQuery booleanQuery = new BooleanQuery();
-
-		// 关键词带空格,进行与操作
-		String[] strs = keyword.split(" ");
-		for (String str : strs) {
-			// 单号、器件型号、 器件品牌名称、器件类目名称
-			BooleanQuery booleanQuery2 = new BooleanQuery();
-			booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_DETAIL_CODE_FIELD, str),
-					BooleanClause.Occur.SHOULD);
-			booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_DETAIL_COMPONENTCODE_FIELD, str),
-					BooleanClause.Occur.SHOULD);
-			booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_DETAIL_KINDNAME_FIELD, str),
-					BooleanClause.Occur.SHOULD);
-			booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_DETAIL_BRANDNAME_FIELD, str),
-					BooleanClause.Occur.SHOULD);
-			booleanQuery.add(booleanQuery2, BooleanClause.Occur.MUST);
-		}
-
-		// 分页信息
-		if (params == null) {
-			sPage.setPage(PAGE_INDEX);
-			sPage.setSize(PAGE_SIZE);
-			sPage.setFirst(true);
-		} else {
-			int page = params.getPage();
-			if (page > 0) {
-				sPage.setPage(page);
-			} else {
-				sPage.setPage(PAGE_INDEX);
-				sPage.setFirst(true);
-			}
-			int size = params.getSize();
-			if (size > 0) {
-				sPage.setSize(size);
-			} else {
-				sPage.setSize(PAGE_SIZE);
-			}
-		}
-		logger.info(booleanQuery);
-
-		try {
-			TopDocs topDocs = null;
-			// 如果页码不为1
-			if (sPage.getPage() > 1) {
-				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) {
-					if ((sPage.getPage() - 1) * sPage.getSize() >= totalHits) {
-						throw new SearchException("页码过大:元素总数量为" + totalHits);
-					}
-					topDocs = indexSearcher.searchAfter(previousScoreDocs[previousScoreDocs.length - 1], booleanQuery,
-							sPage.getSize());
-				}
-			} else {
-				sPage.setFirst(true);
-				topDocs = indexSearcher.search(booleanQuery, sPage.getSize());
-			}
-
-			if (topDocs == null || topDocs.totalHits < 1) {
-				sPage.setTotalElement(0);
-				sPage.setFirst(true);
-				sPage.setLast(true);
-				return sPage;
-			}
-
-			sPage.setTotalElement(topDocs.totalHits);
-			int totalPage = (int) Math.ceil(topDocs.totalHits / (1.0 * sPage.getSize()));
-			sPage.setTotalPage(totalPage);
-			if (totalPage == sPage.getPage()) {
-				sPage.setLast(true);
-			}
-
-			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
-			Map<Long, List<BaseOrderDetail>> map = new HashMap<>();
-			for (ScoreDoc scoreDoc : scoreDocs) {
-				Document document = indexSearcher.doc(scoreDoc.doc);
-				Long orderId = Long.valueOf(document.get(SearchConstants.ORDER_DETAIL_ORDERID_FIELD));
-				List<BaseOrderDetail> baseOrderDetails = map.get(orderId);
-				if (CollectionUtils.isEmpty(baseOrderDetails)) {
-					baseOrderDetails = new ArrayList<>();
-				}
-
-				logger.info(document.get(SearchConstants.ORDER_DETAIL_CODE_FIELD) + " "
-						+ document.get(SearchConstants.ORDER_DETAIL_COMPONENTCODE_FIELD) + " "
-						+ document.get(SearchConstants.ORDER_DETAIL_KINDNAME_FIELD) + " "
-						+ document.get(SearchConstants.ORDER_DETAIL_BRANDNAME_FIELD));
-
-				Long id = Long.valueOf(document.get(SearchConstants.ORDER_DETAIL_ID_FIELD));
-				String code = document.get(SearchConstants.ORDER_DETAIL_CODE_FIELD);
-				String detno = document.get(SearchConstants.ORDER_DETAIL_DETNO_FIELD);
-				if (!StringUtils.isEmpty(detno)) {
-					baseOrderDetails.add(new BaseOrderDetail(id, Short.valueOf(detno), code));
-				} else {
-					baseOrderDetails.add(new BaseOrderDetail(id, null, code));
-				}
-				map.put(orderId, baseOrderDetails);
-			}
-			sPage.setContent(getBaseOrdersByDetails(map));
-		} catch (NumberFormatException | IOException e) {
-			throw new SearchException(e).setDetailedMessage(e);
-		} finally {
-			searcherManager.release(indexSearcher);
-		}
-		return sPage;
-	}
-
-	/**
-	 * 根据销售单id获取其明细
-	 * 
-	 * @param orderid
-	 *            销售单id
-	 * @return 对应的明细信息
-	 */
-	private List<BaseOrderDetail> getOrderDetails(Long orderid) {
-		if (orderid == null) {
-			return null;
-		}
-		List<Document> documents = getDocuments(SearchConstants.ORDER_DETAIL_ORDERID_FIELD, orderid.toString());
-		List<BaseOrderDetail> baseOrderDetails = new ArrayList<>();
-		for (Document document : documents) {
-			Long id = Long.valueOf(document.get(SearchConstants.ORDER_DETAIL_ID_FIELD));
-			String code = document.get(SearchConstants.ORDER_DETAIL_CODE_FIELD);
-			String detno = document.get(SearchConstants.ORDER_DETAIL_DETNO_FIELD);
-			if (!StringUtils.isEmpty(detno)) {
-				baseOrderDetails.add(new BaseOrderDetail(id, Short.valueOf(detno), code));
-			} else {
-				baseOrderDetails.add(new BaseOrderDetail(id, null, code));
-			}
-		}
-		return baseOrderDetails;
-	}
-
-	/**
-	 * 根据销售单明细获取销售单数据
-	 * 
-	 * @param map
-	 *            销售单id为key,销售单明细数据为值
-	 * @return 销售单数据
-	 */
-	public List<BaseOrder> getBaseOrdersByDetails(Map<Long, List<BaseOrderDetail>> map) {
-		List<BaseOrder> baseOrders = new ArrayList<>();
-		if (CollectionUtils.isEmpty(map)) {
-			return baseOrders;
-		}
-		Set<Long> keySet = map.keySet();
-		for (Long key : keySet) {
-			BaseOrder baseOrder = new BaseOrder();
-			List<BaseOrderDetail> baseOrderDetails = map.get(key);
-			baseOrder.setDetails(baseOrderDetails);
-			List<Document> documents = getDocuments(SearchConstants.ORDER_ID_FIELD, Long.toString(key));
-			if (CollectionUtils.isEmpty(documents)) {
-				logger.error("明细表中外键" + key + "对应的主表索引不存在");
-				continue;
-			} else {
-				if (documents.size() > 1) {
-					logger.error("明细表中外键" + key + "对应的主表索引不唯一");
-					continue;
-				} else {
-					Document document = documents.get(0);
-					baseOrder.setId(key);
-					baseOrder.setCode(document.get(SearchConstants.ORDER_CODE_FIELD));
-				}
-			}
-			baseOrders.add(baseOrder);
-		}
-		return baseOrders;
-	}
-
-	/**
-	 * 获取IndexSearcher对象,若为空,抛出异常
-	 * 
-	 * @return IndexSearcher对象
-	 */
-	private IndexSearcher getIndexSearcher() {
-		searcherManager.maybeReopen();
-		IndexSearcher indexSearcher = searcherManager.get();
-		if (indexSearcher == null) {
-			throw new SearchException("获取索引文件失败");
-		}
-		return indexSearcher;
-	}
-
-	/**
-	 * 根据域和搜索词获取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);
-		}
-		return documents;
-	}
-
 	/**
 	 * 搜索主表索引
 	 * 
@@ -477,7 +113,9 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 			throw new SearchException("搜索关键词无效:" + keyword);
 		}
 		IndexSearcher indexSearcher = getIndexSearcher();
+		// 获取该表keyword可以搜索的域
 		List<String> keywordFields = OrderSearchUtils.getKeywordFields(tableName);
+		// 获取filter可以过滤的域
 		List<String> filterFields = OrderSearchUtils.getFilterFields(tableName);
 
 		SPage<BaseOrder> sPage = new SPage<>();
@@ -514,7 +152,6 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 				sPage.setSize(PAGE_SIZE);
 			}
 
-			// filter中的域、日期范围
 			Map<String, Object> filters = params.getFilters();
 			if (!CollectionUtils.isEmpty(filters)) {
 				// filter中可能会有哪些域
@@ -542,10 +179,6 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 					}
 					booleanQuery.add(NumericRangeQuery.newLongRange(SearchConstants.ORDER_CREATETIME_FIELD, minTime,
 							maxTime, true, true), BooleanClause.Occur.MUST);
-					logger.info(minTime);
-					logger.info(maxTime);
-					logger.info(new Date(minTime));
-					logger.info(new Date(maxTime));
 				}
 			}
 		}
@@ -579,6 +212,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 				return searchDetailTable(keyword, params, OrderSearchUtils.getDetailTableName(tableName));
 			}
 
+			// 设置总元素个数、页数等信息
 			sPage.setTotalElement(totalHits);
 			int totalPage = (int) Math.ceil(totalHits / (1.0 * sPage.getSize()));
 			sPage.setTotalPage(totalPage);
@@ -593,6 +227,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 				Long id = Long.valueOf(document.get(OrderSearchUtils.getIdField(tableName)));
 				String code = document.get(OrderSearchUtils.getCodeField(tableName));
 				BaseOrder baseOrder = new BaseOrder(id, code);
+				// 获取明细表的信息,汇合起来返回
 				baseOrder.setDetails(getDetails(id, OrderSearchUtils.getDetailTableName(tableName)));
 				baseOrders.add(baseOrder);
 			}
@@ -679,13 +314,13 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 				topDocs = indexSearcher.search(booleanQuery, sPage.getSize());
 			}
 
+			// 设置总元素个数、页数等信息
 			if (topDocs == null || topDocs.totalHits < 1) {
 				sPage.setTotalElement(0);
 				sPage.setFirst(true);
 				sPage.setLast(true);
 				return sPage;
 			}
-
 			sPage.setTotalElement(topDocs.totalHits);
 			int totalPage = (int) Math.ceil(topDocs.totalHits / (1.0 * sPage.getSize()));
 			sPage.setTotalPage(totalPage);
@@ -694,6 +329,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 			}
 
 			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
+			// 多条明细数据可能同属于一条主表数据,因此先统计主表id(作为key,以免重复,值为其下的明细数据),最后再获取所有的主表数据
 			Map<Long, List<BaseOrderDetail>> map = new HashMap<>();
 			for (ScoreDoc scoreDoc : scoreDocs) {
 				Document document = indexSearcher.doc(scoreDoc.doc);
@@ -713,6 +349,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 				}
 				map.put(orderId, baseOrderDetails);
 			}
+			// 获取主表数据
 			sPage.setContent(getBaseOrdersByDetails(map, OrderSearchUtils.getMainTableName(tableName)));
 		} catch (NumberFormatException | IOException e) {
 			throw new SearchException(e).setDetailedMessage(e);
@@ -723,7 +360,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 	}
 
 	/**
-	 * 明细表中根据主表单据id(外键)获取明细信息
+	 * 明细表中根据主表单据id(外键)获取明细信息
 	 * 
 	 * @param id
 	 *            单据id
@@ -754,7 +391,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 	 * 主表中根据单据明细获取主表数据,汇总后返回
 	 * 
 	 * @param map
-	 *            明细数据,主表id(外键)为key,销售单明细数据为值
+	 *            明细数据,主表id(外键)为key,明细数据为value
 	 * @return 汇总后的数据
 	 */
 	private List<BaseOrder> getBaseOrdersByDetails(Map<Long, List<BaseOrderDetail>> map, String tableName) {
@@ -786,4 +423,48 @@ 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("获取索引文件失败");
+		}
+		return indexSearcher;
+	}
+
+	/**
+	 * 根据域和搜索词获取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);
+		}
+		return documents;
+	}
+
 }