Просмотр исходного кода

利用正则搜索,code等不会被分词为多个词的字段存为TextField,name等会被分词为多个词的字段存为StringField(不然会有边界问题,影响准确度)

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

+ 5 - 4
search-console/src/main/java/com/uas/search/console/service/impl/OrderSearchServiceImpl.java

@@ -275,18 +275,19 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 	 * @return 搜索结果
 	 */
 	private SPage<BaseOrder> searchDetails(String keyword, PageParams params, String tableName) {
+		// 与主表不同,不允许keyword为空(不允许利用正则表达式获取所有明细索引,原因是正则搜索与分词有冲突)
+		if (SearchUtils.isKeywordInvalid(keyword)) {
+			throw new SearchException("搜索关键词无效:" + keyword);
+		}
 		IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(tableName);
 
 		SPage<BaseOrder> sPage = new SPage<>();
 		BooleanQuery booleanQuery = new BooleanQuery();
 
-		if (keyword == null) {
-			keyword = "";
-		}
 		// 关键词带空格,进行与操作
 		String[] strs = keyword.split(" ");
 		for (String str : strs) {
-			booleanQuery.add(SearchUtils.getRegexpQuery(OrderSearchUtils.getDetailsField(tableName), str),
+			booleanQuery.add(SearchUtils.getBooleanQuery(OrderSearchUtils.getDetailsField(tableName), str),
 					BooleanClause.Occur.MUST);
 		}
 

+ 0 - 1
search-console/src/main/java/com/uas/search/console/service/impl/SearchServiceImpl.java

@@ -468,7 +468,6 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 		List<Map<String, Object>> brands = new ArrayList<Map<String, Object>>();
 		// 品牌名称带有空格,并且中英文名并无一定顺序,因此对nameCn、nameEn均要搜索
 		BooleanQuery booleanQuery = new BooleanQuery();
-		logger.info(booleanQuery.toString());
 		String[] keywords = brandName.split(" ");
 		for (String keyword : keywords) {
 			// 搜索nameCn

+ 11 - 10
search-console/src/main/java/com/uas/search/console/util/ObjectToDocumentUtils.java

@@ -179,9 +179,11 @@ public class ObjectToDocumentUtils {
 		}
 		Document document = new Document();
 		document.add(new StringField(SearchConstants.ORDER_ID_FIELD, String.valueOf(order.getId()), Store.YES));
-		document.add(new StringField(SearchConstants.ORDER_CODE_FIELD, order.getCode(), Store.YES));
+		// 利用正则搜索,code等不会被分词为多个词的字段存为TextField
+		document.add(new TextField(SearchConstants.ORDER_CODE_FIELD, order.getCode(), Store.YES));
 		document.add(
 				new StringField(SearchConstants.ORDER_BUYERUU_FIELD, String.valueOf(order.getBuyeruu()), Store.YES));
+		// 利用正则搜索,name等会被分词为多个词的字段存为StringField(不然会有边界问题,影响准确度)
 		document.add(new StringField(SearchConstants.ORDER_BUYERNAME_FIELD, order.getBuyername(), Store.YES));
 		document.add(new StringField(SearchConstants.ORDER_BUYERENUU_FIELD,
 				String.valueOf(order.getBuyerEnterprise().getUu()), Store.YES));
@@ -195,8 +197,8 @@ public class ObjectToDocumentUtils {
 		document.add(new StringField(SearchConstants.ORDER_STATUS_FIELD, String.valueOf(order.getStatus()), Store.YES));
 		// 明细以json的格式存储
 		if (!CollectionUtils.isEmpty(order.getDetails())) {
-			document.add(new StringField(SearchConstants.ORDER_DETAILS_FIELD,
-					JSONObject.toJSONString(order.getDetails()), Store.YES));
+			document.add(new TextField(SearchConstants.ORDER_DETAILS_FIELD, JSONObject.toJSONString(order.getDetails()),
+					Store.YES));
 		}
 		return document;
 	}
@@ -219,7 +221,7 @@ public class ObjectToDocumentUtils {
 		Document document = new Document();
 		document.add(new StringField(SearchConstants.ORDER_INVOICE_ID_FIELD, String.valueOf(orderInvoice.getId()),
 				Store.YES));
-		document.add(new StringField(SearchConstants.ORDER_INVOICE_CODE_FIELD, orderInvoice.getCode(), Store.YES));
+		document.add(new TextField(SearchConstants.ORDER_INVOICE_CODE_FIELD, orderInvoice.getCode(), Store.YES));
 		document.add(new StringField(SearchConstants.ORDER_INVOICE_BUYERUU_FIELD,
 				String.valueOf(orderInvoice.getBuyeruu()), Store.YES));
 		document.add(
@@ -233,7 +235,7 @@ public class ObjectToDocumentUtils {
 		document.add(new StringField(SearchConstants.ORDER_INVOICE_STATUS_FIELD,
 				String.valueOf(orderInvoice.getStatus()), Store.YES));
 		if (!CollectionUtils.isEmpty(orderInvoice.getDetails())) {
-			document.add(new StringField(SearchConstants.ORDER_INVOICE_DETAILS_FIELD,
+			document.add(new TextField(SearchConstants.ORDER_INVOICE_DETAILS_FIELD,
 					JSONObject.toJSONString(orderInvoice.getDetails()), Store.YES));
 		}
 		return document;
@@ -254,7 +256,7 @@ public class ObjectToDocumentUtils {
 		}
 		Document document = new Document();
 		document.add(new StringField(SearchConstants.PURCHASE_ID_FIELD, String.valueOf(purchase.getId()), Store.YES));
-		document.add(new StringField(SearchConstants.PURCHASE_CODE_FIELD, purchase.getCode(), Store.YES));
+		document.add(new TextField(SearchConstants.PURCHASE_CODE_FIELD, purchase.getCode(), Store.YES));
 		document.add(new StringField(SearchConstants.PURCHASE_SELLERENUU_FIELD,
 				String.valueOf(purchase.getSellerenuu()), Store.YES));
 		document.add(
@@ -264,7 +266,7 @@ public class ObjectToDocumentUtils {
 		document.add(new StringField(SearchConstants.PURCHASE_STATUS_FIELD, String.valueOf(purchase.getStatus()),
 				Store.YES));
 		if (!CollectionUtils.isEmpty(purchase.getDetails())) {
-			document.add(new StringField(SearchConstants.PURCHASE_DETAILS_FIELD,
+			document.add(new TextField(SearchConstants.PURCHASE_DETAILS_FIELD,
 					JSONObject.toJSONString(purchase.getDetails()), Store.YES));
 		}
 		return document;
@@ -286,8 +288,7 @@ public class ObjectToDocumentUtils {
 		Document document = new Document();
 		document.add(new StringField(SearchConstants.PURCHASE_INVOICE_ID_FIELD, String.valueOf(purchaseInvoice.getId()),
 				Store.YES));
-		document.add(
-				new StringField(SearchConstants.PURCHASE_INVOICE_CODE_FIELD, purchaseInvoice.getCode(), Store.YES));
+		document.add(new TextField(SearchConstants.PURCHASE_INVOICE_CODE_FIELD, purchaseInvoice.getCode(), Store.YES));
 		document.add(new StringField(SearchConstants.PURCHASE_INVOICE_SELLERENUU_FIELD,
 				String.valueOf(purchaseInvoice.getSellerenuu()), Store.YES));
 		document.add(new StringField(SearchConstants.PURCHASE_INVOICE_SELLERENNAME_FIELD,
@@ -297,7 +298,7 @@ public class ObjectToDocumentUtils {
 		document.add(new StringField(SearchConstants.PURCHASE_INVOICE_STATUS_FIELD,
 				String.valueOf(purchaseInvoice.getStatus()), Store.YES));
 		if (!CollectionUtils.isEmpty(purchaseInvoice.getDetails())) {
-			document.add(new StringField(SearchConstants.PURCHASE_INVOICE_DETAILS_FIELD,
+			document.add(new TextField(SearchConstants.PURCHASE_INVOICE_DETAILS_FIELD,
 					JSONObject.toJSONString(purchaseInvoice.getDetails()), Store.YES));
 		}
 		return document;

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

@@ -108,6 +108,7 @@ public class SearchUtils {
 		if (StringUtils.isEmpty(field)) {
 			return null;
 		}
+		// TODO 针对的是分词了的字段(未分词的字段可能搜索不准确)
 		return new RegexpQuery(new Term(field, ".*" + keyword.toLowerCase() + ".*"));
 	}