فهرست منبع

use RegexpQuery and StringFieldComparatorSource for getGoodsIds

sunyj 8 سال پیش
والد
کامیت
7399e0192c

+ 17 - 9
src/main/java/com/uas/search/service/impl/SearchServiceImpl.java

@@ -1000,7 +1000,7 @@ public class SearchServiceImpl implements SearchService {
 			} else{
 			    sortFieldList.add(SortField.FIELD_SCORE);
             }
-            sortFieldList.addAll(Arrays.asList(sortGoods()));
+            sortFieldList.addAll(Arrays.asList(sortGoods(keyword)));
             SortField[] sortFields = new SortField[sortFieldList.size()];
             sortFieldList.toArray(sortFields);
             Sort sort = new Sort(sortFields);
@@ -1056,12 +1056,15 @@ public class SearchServiceImpl implements SearchService {
     /**
      * @return 批次排序规则
      */
-    private SortField[] sortGoods() {
-        // 批次(访问量) > 器件(访问量 > 搜索次数) > 品牌(权重 > 访问量 > 搜索次数) > 类目(访问量 > 搜索次数)
+    private SortField[] sortGoods(String keyword) {
+        // 批次(访问量) > 器件(自定义排序 > 访问量 > 搜索次数) > 品牌(自定义排序 > 权重 > 访问量 > 搜索次数) > 类目(访问量 > 搜索次数)
         return new SortField[]{
+                new SortField(SearchConstants.GOODS_CMP_CODE_FIELD, new StringFieldComparatorSource(keyword)),
                 sortField(SearchConstants.GOODS_GO_VISIT_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
                 sortField(SearchConstants.GOODS_CMP_VISIT_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
                 sortField(SearchConstants.GOODS_CMP_SEARCH_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
+                new SortField(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword)),
+                new SortField(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword)),
                 sortField(SearchConstants.GOODS_BR_WEIGHT_FIELD, Type.DOUBLE, true, Double.MIN_VALUE),
                 sortField(SearchConstants.GOODS_BR_VISIT_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
                 sortField(SearchConstants.GOODS_BR_SEARCH_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
@@ -1194,7 +1197,7 @@ public class SearchServiceImpl implements SearchService {
 				for (String keywordField : keywordFields) {
 					// 是否分词
 					if (tokenized == null || !tokenized.booleanValue()) {
-						booleanQuery2.add(new TermQuery(new Term(keywordField, keyword)), BooleanClause.Occur.SHOULD);
+						booleanQuery2.add(new TermQuery(new Term(keywordField, keyword.toLowerCase())), BooleanClause.Occur.SHOULD);
 					} else {
 						booleanQuery2.add(SearchUtils.getBooleanQuery(keywordField, keyword),
 								BooleanClause.Occur.SHOULD);
@@ -1214,13 +1217,13 @@ public class SearchServiceImpl implements SearchService {
 	 */
 	private Query setGoodsBoost(String keyword) {
 		BooleanQuery booleanQuery = new BooleanQuery();
-		BooleanQuery componentCodeQuery = createQuery(SearchConstants.GOODS_CMP_CODE_FIELD, keyword);
+		BooleanQuery componentCodeQuery = createQuery(SearchConstants.GOODS_CMP_CODE_FIELD, keyword, true);
 		componentCodeQuery.setBoost(100);
 		booleanQuery.add(componentCodeQuery, BooleanClause.Occur.SHOULD);
-		BooleanQuery brandNameCnQuery = createQuery(SearchConstants.GOODS_BR_NAME_CN_FIELD, keyword);
+		BooleanQuery brandNameCnQuery = createQuery(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, keyword, true);
 		brandNameCnQuery.setBoost(10);
 		booleanQuery.add(brandNameCnQuery, BooleanClause.Occur.SHOULD);
-		BooleanQuery brandNameEnQuery = createQuery(SearchConstants.GOODS_BR_NAME_EN_FIELD, keyword);
+		BooleanQuery brandNameEnQuery = createQuery(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, keyword, true);
 		brandNameEnQuery.setBoost(10);
 		booleanQuery.add(brandNameEnQuery, BooleanClause.Occur.SHOULD);
 		BooleanQuery kindNameQuery = createQuery(SearchConstants.GOODS_KI_NAME_CN_FIELD, keyword);
@@ -1232,7 +1235,12 @@ public class SearchServiceImpl implements SearchService {
 		return booleanQuery;
 	}
 
-	private BooleanQuery createQuery(String field, String keyword){
+    private BooleanQuery createQuery(String field, String keyword){
+       return createQuery(field, keyword, false);
+    }
+
+
+    private BooleanQuery createQuery(String field, String keyword, boolean useRegexpQuery){
         if (StringUtils.isEmpty(field) || StringUtils.isEmpty(keyword)) {
             return null;
         }
@@ -1241,7 +1249,7 @@ public class SearchServiceImpl implements SearchService {
         String[] array = keyword.split(" ");
         for(String str : array){
             if(!StringUtils.isEmpty(str)){
-                booleanQuery.add(SearchUtils.getBooleanQuery(field, str), Occur.SHOULD);
+                booleanQuery.add(SearchUtils.getBooleanQuery(field, str, useRegexpQuery), Occur.SHOULD);
             }
         }
         return booleanQuery;

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

@@ -141,9 +141,8 @@ public class ObjectToDocumentUtils {
 		document.add(new StringField(SearchConstants.COMPONENT_ID_FIELD, String.valueOf(component.getId()), Store.YES));
 		document.add(new StringField(SearchConstants.COMPONENT_UUID_FIELD, component.getUuid(), Store.YES));
 		// 转小写,以避免分词,又不会因大小写影响搜索
-		String code = component.getCode().toLowerCase();
-		document.add(new StringField(SearchConstants.COMPONENT_CODE_FIELD, code, Store.YES));
-		document.add(new BinaryDocValuesField(SearchConstants.COMPONENT_CODE_FIELD, new BytesRef(code)));
+		document.add(new StringField(SearchConstants.COMPONENT_CODE_FIELD, component.getCode().toLowerCase(), Store.YES));
+		document.add(new BinaryDocValuesField(SearchConstants.COMPONENT_CODE_FIELD, new BytesRef(component.getCode())));
         if (component.getVisitCount() != null) {
             document.add(new DoubleDocValuesField(SearchConstants.COMPONENT_VISIT_COUNT_FIELD, component.getVisitCount()));
             document.add(new LongField(SearchConstants.COMPONENT_VISIT_COUNT_FIELD, component.getVisitCount(), Store.YES));
@@ -272,7 +271,8 @@ public class ObjectToDocumentUtils {
 
 		Component component = goods.getComponent();
 		document.add(new StringField(SearchConstants.GOODS_CMP_ID_FIELD, String.valueOf(component.getId()), Store.YES));
-		document.add(new TextField(SearchConstants.GOODS_CMP_CODE_FIELD, component.getCode(), Store.YES));
+		document.add(new StringField(SearchConstants.GOODS_CMP_CODE_FIELD, component.getCode().toLowerCase(), Store.YES));
+        document.add(new BinaryDocValuesField(SearchConstants.GOODS_CMP_CODE_FIELD, new BytesRef(component.getCode())));
         if (component.getDescription() != null) {
             document.add(new TextField(SearchConstants.GOODS_CMP_DESCRIPTION_FIELD, component.getDescription(), Store.YES));
         }
@@ -315,11 +315,13 @@ public class ObjectToDocumentUtils {
 		}
 		if (brand.getNameCn() != null) {
 			document.add(new TextField(SearchConstants.GOODS_BR_NAME_CN_FIELD, brand.getNameCn(), Store.YES));
-			document.add(new StringField(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, brand.getNameCn(), Store.YES));
+			document.add(new StringField(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, brand.getNameCn().toLowerCase(), Store.YES));
+            document.add(new BinaryDocValuesField(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, new BytesRef(brand.getNameCn())));
 		}
 		if (brand.getNameEn() != null) {
 			document.add(new TextField(SearchConstants.GOODS_BR_NAME_EN_FIELD, brand.getNameEn(), Store.YES));
-			document.add(new StringField(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, brand.getNameEn(), Store.YES));
+			document.add(new StringField(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, brand.getNameEn().toLowerCase(), Store.YES));
+            document.add(new BinaryDocValuesField(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, new BytesRef(brand.getNameEn())));
 		}
 		if (brand.getUuid() != null) {
 			document.add(new StringField(SearchConstants.GOODS_BR_UUID_FIELD, brand.getUuid(), Store.YES));