Browse Source

sort component using StringFieldComparatorSource
(use PrefixQuery rather than RegexpQuery)

sunyj 8 years ago
parent
commit
79497b0e9f

+ 3 - 0
mall-search/src/main/java/com/uas/search/constant/SearchConstants.java

@@ -93,6 +93,7 @@ public class SearchConstants {
 	public static final String COMPONENT_ORIGINAL_QTY_FIELD = "cmp_original_qty";
 	public static final String COMPONENT_INACTION_STOCK_QTY_FIELD = "cmp_inaction_stock_qty";
 	public static final String COMPONENT_KI_ID_FIELD = "ki_id";
+	public static final String COMPONENT_KI_NAME_UNTOKENIZED_FIELD = "ki_name_cn_untokenized";
 	public static final String COMPONENT_KI_NAME_FIELD = "ki_name_cn";
 	public static final String COMPONENT_KI_LEVEL_FIELD = "ki_level";
     public static final String COMPONENT_KI_VISIT_COUNT_FIELD = "ki_visit_count";
@@ -100,6 +101,8 @@ public class SearchConstants {
 	public static final String COMPONENT_BR_ID_FIELD = "br_id";
 	public static final String COMPONENT_BR_NAMECN_FIELD = "br_name_cn";
 	public static final String COMPONENT_BR_NAMEEN_FIELD = "br_name_en";
+	public static final String COMPONENT_BR_NAMECN_UNTOKENIZED_FIELD = "br_name_cn_untokenized";
+	public static final String COMPONENT_BR_NAMEEN_UNTOKENIZED_FIELD = "br_name_en_untokenized";
 	public static final String COMPONENT_BR_UUID_FIELD = "br_uuid";
     public static final String COMPONENT_BR_VISIT_COUNT_FIELD = "br_visit_count";
     public static final String COMPONENT_BR_SEARCH_COUNT_FIELD = "br_search_count";

+ 11 - 15
mall-search/src/main/java/com/uas/search/service/impl/SearchServiceImpl.java

@@ -304,7 +304,7 @@ public class SearchServiceImpl implements SearchService {
 			}
 			logger.info(booleanQuery.toString());
 
-			Sort sort = new Sort(sortComponent());
+			Sort sort = new Sort(sortComponent(keyword));
 			TopDocs hits;
 			if (pageParams.getPage() > 1) {// 不是第一页
 				TopDocs previousHits = indexSearcher.search(booleanQuery,
@@ -350,34 +350,30 @@ public class SearchServiceImpl implements SearchService {
 				new Term(SearchConstants.COMPONENT_CODE_FIELD, keyword.toLowerCase()));
 		prefixQuery.setBoost(100);
 		booleanQuery.add(prefixQuery, BooleanClause.Occur.SHOULD);
-		BooleanQuery brandNameCnQuery = SearchUtils.getBooleanQuery(SearchConstants.COMPONENT_BR_NAMECN_FIELD,
-				keyword);
-		brandNameCnQuery.setBoost(10);
-		booleanQuery.add(brandNameCnQuery, BooleanClause.Occur.SHOULD);
-		BooleanQuery brandNameEnQuery = SearchUtils.getBooleanQuery(SearchConstants.COMPONENT_BR_NAMEEN_FIELD,
-				keyword);
-		brandNameEnQuery.setBoost(10);
-		booleanQuery.add(brandNameEnQuery, BooleanClause.Occur.SHOULD);
-		BooleanQuery kindNameQuery = SearchUtils.getBooleanQuery(SearchConstants.COMPONENT_KI_NAME_FIELD, keyword);
-		kindNameQuery.setBoost(1);
-		booleanQuery.add(kindNameQuery, BooleanClause.Occur.SHOULD);
+		booleanQuery.add(createQuery(SearchConstants.COMPONENT_BR_NAMECN_FIELD, keyword, 10), BooleanClause.Occur.SHOULD);
+		booleanQuery.add(createQuery(SearchConstants.COMPONENT_BR_NAMEEN_FIELD, keyword, 10), BooleanClause.Occur.SHOULD);
+		booleanQuery.add(createQuery(SearchConstants.COMPONENT_KI_NAME_FIELD, keyword, 1), BooleanClause.Occur.SHOULD);
 		return booleanQuery;
 	}
 
     /**
      * @return 器件排序规则
      */
-    private SortField[] sortComponent() {
+    private SortField[] sortComponent(String keyword) {
         // 分数 > 器件(访问量 > 搜索次数) > 品牌(权重 > 访问量 > 搜索次数) > 类目(访问量 > 搜索次数)
         return new SortField[]{
-                SortField.FIELD_SCORE,
+				new SortField(SearchConstants.COMPONENT_CODE_FIELD, new StringFieldComparatorSource(keyword)),
                 sortField(SearchConstants.COMPONENT_VISIT_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
                 sortField(SearchConstants.COMPONENT_SEARCH_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
+				new SortField(SearchConstants.COMPONENT_BR_NAMEEN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword)),
+				new SortField(SearchConstants.COMPONENT_BR_NAMECN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword)),
                 sortField(SearchConstants.COMPONENT_BR_WEIGHT_FIELD, Type.DOUBLE, true, Double.MIN_VALUE),
                 sortField(SearchConstants.COMPONENT_BR_VISIT_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
                 sortField(SearchConstants.COMPONENT_BR_SEARCH_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
+				new SortField(SearchConstants.COMPONENT_KI_NAME_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword)),
                 sortField(SearchConstants.COMPONENT_KI_VISIT_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
-                sortField(SearchConstants.COMPONENT_KI_SEARCH_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE)
+                sortField(SearchConstants.COMPONENT_KI_SEARCH_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
+				SortField.FIELD_SCORE
         };
     }
 

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

@@ -155,6 +155,8 @@ public class ObjectToDocumentUtils {
         Kind kind = component.getKind();
         document.add(new StringField(SearchConstants.COMPONENT_KI_ID_FIELD, String.valueOf(kind.getId()), Store.YES));
 		document.add(new TextField(SearchConstants.COMPONENT_KI_NAME_FIELD, kind.getNameCn(), Store.YES));
+        document.add(new StringField(SearchConstants.COMPONENT_KI_NAME_UNTOKENIZED_FIELD, kind.getNameCn().toLowerCase(), Store.YES));
+        document.add(new BinaryDocValuesField(SearchConstants.COMPONENT_KI_NAME_UNTOKENIZED_FIELD, new BytesRef(kind.getNameCn())));
 		document.add(new StringField(SearchConstants.COMPONENT_KI_LEVEL_FIELD, String.valueOf(kind.getLevel()), Store.YES));
         if (kind.getVisitCount() != null) {
             document.add(new DoubleDocValuesField(SearchConstants.COMPONENT_KI_VISIT_COUNT_FIELD, kind.getVisitCount()));
@@ -168,8 +170,12 @@ public class ObjectToDocumentUtils {
         Brand brand = component.getBrand();
         document.add(new StringField(SearchConstants.COMPONENT_BR_ID_FIELD, String.valueOf(brand.getId()), Store.YES));
 		document.add(new TextField(SearchConstants.COMPONENT_BR_NAMECN_FIELD, brand.getNameCn(), Store.YES));
+        document.add(new StringField(SearchConstants.COMPONENT_BR_NAMECN_UNTOKENIZED_FIELD, brand.getNameCn().toLowerCase(), Store.YES));
+        document.add(new BinaryDocValuesField(SearchConstants.COMPONENT_BR_NAMECN_UNTOKENIZED_FIELD, new BytesRef(brand.getNameCn())));
 		if(brand.getNameEn() != null){
 			document.add(new TextField(SearchConstants.COMPONENT_BR_NAMEEN_FIELD, brand.getNameEn(), Store.YES));
+            document.add(new StringField(SearchConstants.COMPONENT_BR_NAMEEN_UNTOKENIZED_FIELD, brand.getNameEn().toLowerCase(), Store.YES));
+            document.add(new BinaryDocValuesField(SearchConstants.COMPONENT_BR_NAMEEN_UNTOKENIZED_FIELD, new BytesRef(brand.getNameEn())));
 		}
 		document.add(new StringField(SearchConstants.COMPONENT_BR_UUID_FIELD, brand.getUuid(), Store.YES));
         if (brand.getVisitCount() != null) {