Quellcode durchsuchen

获取索引中数据时,支持指定关键词、字段、是否分词

sunyj vor 8 Jahren
Ursprung
Commit
705cf64b86

+ 7 - 6
search-console/src/main/java/com/uas/search/console/controller/SearchController.java

@@ -303,11 +303,12 @@ public class SearchController {
 		return innerSearchService.getGoods(id);
 	}
 
-	@RequestMapping("/allObjects")
+	@RequestMapping("/objects")
 	@ResponseBody
-	public SPage<Object> getAllObjects(@RequestParam(required = true) String tableName, Integer page, Integer size) {
-		return innerSearchService.getAllObjects(tableName.toLowerCase(), page == null ? 0 : page,
-				size == null ? 0 : size);
+	public SPage<Object> getObjects(@RequestParam(required = true) String tableName, String keyword, String field,
+			Boolean tokenized, Integer page, Integer size) {
+		return innerSearchService.getObjects(tableName.toLowerCase(), keyword, field, tokenized,
+				page == null ? 0 : page, size == null ? 0 : size);
 	}
 
 	@RequestMapping("/allObjectsToFiles")
@@ -321,7 +322,7 @@ public class SearchController {
 		// 先删除旧的文件
 		FileUtils.deleteSubFiles(new File(SearchUtils.getDataPath(tableName)));
 
-		SPage<Object> sPage = innerSearchService.getAllObjects(tableName.toLowerCase(), page, size);
+		SPage<Object> sPage = innerSearchService.getObjects(tableName.toLowerCase(), null, null, null, page, size);
 		// 索引中数据的总数目
 		long totalElements = sPage.getTotalElement();
 		logger.info("发现数据:" + totalElements + "条");
@@ -354,7 +355,7 @@ public class SearchController {
 				if (++page > sPage.getTotalPage()) {
 					break;
 				}
-				sPage = innerSearchService.getAllObjects(tableName.toLowerCase(), page, size);
+				sPage = innerSearchService.getObjects(tableName.toLowerCase(), null, null, null, page, size);
 			}
 			printWriter.flush();
 			printWriter.close();

+ 5 - 1
search-console/src/main/java/com/uas/search/console/service/InnerSearchService.java

@@ -49,9 +49,13 @@ public interface InnerSearchService {
 	 * 分页获取本地指定表的索引中的所有数据
 	 * 
 	 * @param tableName
+	 * @param keyword
+	 * @param field
+	 * @param tokenized
 	 * @param page
 	 * @param size
 	 * @return
 	 */
-	public SPage<Object> getAllObjects(String tableName, int page, int size);
+	public SPage<Object> getObjects(String tableName, String keyword, String field, Boolean tokenized, int page,
+			int size);
 }

+ 67 - 8
search-console/src/main/java/com/uas/search/console/service/impl/SearchServiceImpl.java

@@ -1202,15 +1202,74 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 	}
 
 	@Override
-	public SPage<Object> getAllObjects(String tableName, int page, int size) {
-		SPage<Document> documents = SearchUtils.getAllDocuments(tableName, page, size);
-		SPage<Object> sPage = new SPage<Object>(documents.getTotalPage(), documents.getTotalElement(),
-				documents.getPage(), documents.getSize(), documents.isFirst(), documents.isLast());
-		List<Object> content = new ArrayList<>();
-		for (Document document : documents.getContent()) {
-			content.add(DocumentToObjectUtils.toObject(document, tableName));
+	public SPage<Object> getObjects(String tableName, String keyword, String field, Boolean tokenized, int page,
+			int size) {
+		if (keyword == null) {
+			keyword = "";
+		}
+		if (field == null) {
+			field = SearchUtils.getIdField(tableName);
+		}
+		if (tokenized == null) {
+			tokenized = false;
+		}
+		IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(tableName);
+		SPage<Object> sPage = new SPage<>();
+		try {
+			Query query;
+			if (tokenized) {
+				query = SearchUtils.getBooleanQuery(field, keyword);
+			} else {
+				query = SearchUtils.getRegexpQuery(field, keyword);
+			}
+			// 分页信息
+			if (page > 0) {
+				sPage.setPage(page);
+			} else {
+				sPage.setPage(1);
+				sPage.setFirst(true);
+			}
+			if (size > 0) {
+				sPage.setSize(size);
+			} else {
+				sPage.setSize(20);
+			}
+
+			TopDocs topDocs;
+			// 如果页码不为1
+			if (sPage.getPage() > 1) {
+				TopDocs previousTopDocs = indexSearcher.search(query, (sPage.getPage() - 1) * sPage.getSize());
+				int totalHits = previousTopDocs.totalHits;
+				ScoreDoc[] previousScoreDocs = previousTopDocs.scoreDocs;
+				if ((sPage.getPage() - 1) * sPage.getSize() >= totalHits) {
+					throw new SearchException("页码过大:元素总数量为" + totalHits);
+				}
+				topDocs = indexSearcher.searchAfter(previousScoreDocs[previousScoreDocs.length - 1], query,
+						sPage.getSize());
+			} else {
+				sPage.setFirst(true);
+				topDocs = indexSearcher.search(query, sPage.getSize());
+			}
+
+			int totalHits = topDocs.totalHits;
+			// 设置总元素个数、页数等信息
+			sPage.setTotalElement(totalHits);
+			int totalPage = (int) Math.ceil(totalHits / (1.0 * sPage.getSize()));
+			sPage.setTotalPage(totalPage);
+			if (totalPage == sPage.getPage()) {
+				sPage.setLast(true);
+			}
+			List<Object> content = new ArrayList<>();
+			for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
+				Document document = indexSearcher.doc(scoreDoc.doc);
+				content.add(DocumentToObjectUtils.toObject(document, tableName));
+			}
+			sPage.setContent(content);
+		} catch (IOException e) {
+			throw new SearchException(e).setDetailedMessage(e);
+		} finally {
+			SearchUtils.releaseIndexSearcher(indexSearcher);
 		}
-		sPage.setContent(content);
 		return sPage;
 	}
 

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

@@ -36,7 +36,6 @@ import com.uas.search.console.model.PurchaseInvoiceSimpleInfo;
 import com.uas.search.console.model.PurchaseSimpleInfo;
 import com.uas.search.console.support.IndexSearcherManager;
 import com.uas.search.exception.SearchException;
-import com.uas.search.model.SPage;
 
 /**
  * 搜索相关的工具类
@@ -282,80 +281,16 @@ public class SearchUtils {
 		return documents;
 	}
 
-	/**
-	 * 获取所有Document
-	 * 
-	 * @param tableName
-	 *            表名
-	 * @param page
-	 *            页码
-	 * @param size
-	 *            页面大小
-	 * @return
-	 */
-	public static SPage<Document> getAllDocuments(String tableName, int page, int size) {
-		IndexSearcher indexSearcher = getIndexSearcher(tableName);
-		SPage<Document> sPage = new SPage<>();
-		try {
-			RegexpQuery query = getRegexpQuery(getIdField(tableName), "");
-			// 分页信息
-			if (page > 0) {
-				sPage.setPage(page);
-			} else {
-				sPage.setPage(1);
-				sPage.setFirst(true);
-			}
-			if (size > 0) {
-				sPage.setSize(size);
-			} else {
-				sPage.setSize(20);
-			}
-
-			TopDocs topDocs;
-			// 如果页码不为1
-			if (sPage.getPage() > 1) {
-				TopDocs previousTopDocs = indexSearcher.search(query, (sPage.getPage() - 1) * sPage.getSize());
-				int totalHits = previousTopDocs.totalHits;
-				ScoreDoc[] previousScoreDocs = previousTopDocs.scoreDocs;
-				if ((sPage.getPage() - 1) * sPage.getSize() >= totalHits) {
-					throw new SearchException("页码过大:元素总数量为" + totalHits);
-				}
-				topDocs = indexSearcher.searchAfter(previousScoreDocs[previousScoreDocs.length - 1], query,
-						sPage.getSize());
-			} else {
-				sPage.setFirst(true);
-				topDocs = indexSearcher.search(query, sPage.getSize());
-			}
-
-			int totalHits = topDocs.totalHits;
-			// 设置总元素个数、页数等信息
-			sPage.setTotalElement(totalHits);
-			int totalPage = (int) Math.ceil(totalHits / (1.0 * sPage.getSize()));
-			sPage.setTotalPage(totalPage);
-			if (totalPage == sPage.getPage()) {
-				sPage.setLast(true);
-			}
-			List<Document> content = new ArrayList<>();
-			for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
-				Document document = indexSearcher.doc(scoreDoc.doc);
-				content.add(document);
-			}
-			sPage.setContent(content);
-		} catch (IOException e) {
-			throw new SearchException(e).setDetailedMessage(e);
-		} finally {
-			releaseIndexSearcher(indexSearcher);
-		}
-		return sPage;
-	}
-
 	/**
 	 * 获取各表索引的id字段名
 	 * 
 	 * @param tableName
 	 * @return
 	 */
-	private static String getIdField(String tableName) {
+	public static String getIdField(String tableName) {
+		if (tableName == null) {
+			return null;
+		}
 		if (tableName.equals(SearchConstants.KIND_TABLE_NAME)) {
 			return SearchConstants.KIND_ID_FIELD;
 		} else if (tableName.equals(SearchConstants.BRAND_TABLE_NAME)) {

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

@@ -51,7 +51,8 @@
 					<li><a target="_blank">search/brand/12</a></li>
 					<li><a target="_blank">search/component/12</a></li>
 					<li><a target="_blank">search/goods/AAAevvAAHAAI1EIAAB</a></li>
-					<li><a target="_blank">search/allObjects?tableName=product$brand&page=1&size=10</a></li>
+					<li><a target="_blank">search/objects?tableName=product$brand&keyword=松下&field=br_name_cn&tokenized=true&page=1&size=10</a></li>
+					<li><a target="_blank">search/objects?tableName=product$brand&page=1&size=10</a></li>
 					<li><a target="_blank">search/allObjectsToFiles?tableName=product$brand</a></li>
 				</ol>
 			</ol>