Browse Source

use PrefixQuery rather than RegexpQuery in goods search

sunyj 8 years ago
parent
commit
0b63008232

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

@@ -133,6 +133,7 @@ public class SearchConstants {
     public static final String GOODS_CMP_SEARCH_COUNT_FIELD = "cmp_search_count";
 	public static final String GOODS_KI_ID_FIELD = "ki_id";
 	public static final String GOODS_KI_NAME_CN_FIELD = "ki_name_cn";
+	public static final String GOODS_KI_NAME_CN_UNTOKENIZED_FIELD = "ki_name_cn_untokenized";
 	public static final String GOODS_KI_LEVEL_FIELD = "ki_level";
 	public static final String GOODS_KI_ISLEAF_FIELD = "ki_isleaf";
     public static final String GOODS_KI_VISIT_COUNT_FIELD = "ki_visit_count";

+ 5 - 4
mall-search/src/main/java/com/uas/search/service/impl/SearchServiceImpl.java

@@ -1033,6 +1033,7 @@ public class SearchServiceImpl implements SearchService {
                 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),
+                new SortField(SearchConstants.GOODS_KI_NAME_CN_UNTOKENIZED_FIELD, new StringFieldComparatorSource(keyword)),
                 sortField(SearchConstants.GOODS_KI_VISIT_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE),
                 sortField(SearchConstants.GOODS_KI_SEARCH_COUNT_FIELD, Type.LONG, true, Long.MIN_VALUE)
         };
@@ -1186,12 +1187,12 @@ public class SearchServiceImpl implements SearchService {
 	private Query setGoodsBoost(String keyword) {
 		BooleanQuery booleanQuery = new BooleanQuery();
 		// 原厂型号
-		booleanQuery.add(createQuery(SearchConstants.GOODS_CMP_CODE_FIELD, keyword, true, 100), BooleanClause.Occur.SHOULD);
+		booleanQuery.add(createQuery(SearchConstants.GOODS_CMP_CODE_FIELD, keyword, 100), BooleanClause.Occur.SHOULD);
 		// 非标
-		booleanQuery.add(createQuery(SearchConstants.GOODS_PR_PCMPCODE_FIELD, keyword, true, 100), Occur.SHOULD);
+		booleanQuery.add(createQuery(SearchConstants.GOODS_PR_PCMPCODE_FIELD, keyword, 100), Occur.SHOULD);
 		// 品牌
-		booleanQuery.add(createQuery(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, keyword, true, 10), BooleanClause.Occur.SHOULD);
-		booleanQuery.add(createQuery(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, keyword, true, 10), BooleanClause.Occur.SHOULD);
+		booleanQuery.add(createQuery(SearchConstants.GOODS_BR_NAME_CN_FIELD, keyword, 10), BooleanClause.Occur.SHOULD);
+		booleanQuery.add(createQuery(SearchConstants.GOODS_BR_NAME_EN_FIELD, keyword, 10), BooleanClause.Occur.SHOULD);
 		// 类目
 		booleanQuery.add(createQuery(SearchConstants.GOODS_KI_NAME_CN_FIELD, keyword, 1), BooleanClause.Occur.SHOULD);
 		// 属性值

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

@@ -305,6 +305,8 @@ public class ObjectToDocumentUtils {
 			}
 			if (kind.getNameCn() != null) {
 				document.add(new TextField(SearchConstants.GOODS_KI_NAME_CN_FIELD, kind.getNameCn(), Store.YES));
+				document.add(new StringField(SearchConstants.GOODS_KI_NAME_CN_UNTOKENIZED_FIELD, kind.getNameCn().toLowerCase(), Store.YES));
+				document.add(new BinaryDocValuesField(SearchConstants.GOODS_KI_NAME_CN_UNTOKENIZED_FIELD, new BytesRef( kind.getNameCn())));
 			}
 			if (kind.getLevel() != null) {
 				document.add(new NumericDocValuesField(SearchConstants.GOODS_KI_LEVEL_FIELD, kind.getIsLeaf()));