Browse Source

use PrefixQuery when fetching similar component codes

sunyj 8 years ago
parent
commit
e5133389c4

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

@@ -695,7 +695,7 @@ public class SearchServiceImpl implements SearchService {
 	 */
 	private List<String> getSimilarComponentCodes(String componentCode, Integer size) {
 		return getSimilarValues(SearchConstants.COMPONENT_TABLE_NAME, SearchConstants.COMPONENT_CODE_FIELD,
-                SearchConstants.COMPONENT_CODE_FIELD, componentCode.toLowerCase(), size);
+                SearchConstants.COMPONENT_CODE_FIELD, componentCode.toLowerCase(), size, true);
 	}
 
 	/**
@@ -708,7 +708,7 @@ public class SearchServiceImpl implements SearchService {
 	private List<String> getSimilarBrandNames(String brandName, Integer size) {
 		// 获取相似的中文品牌
 		List<String> nameCns = getSimilarValues(SearchConstants.BRAND_TABLE_NAME, SearchConstants.BRAND_NAMECN_FIELD,
-                SearchConstants.BRAND_NAMECN_UNTOKENIZED_FIELD, brandName, size);
+                SearchConstants.BRAND_NAMECN_UNTOKENIZED_FIELD, brandName, size, false);
 		// 相似的中文品牌数量足够,直接返回
 		if (nameCns != null && nameCns.size() == SIMILAR_NUM) {
 			return nameCns;
@@ -717,7 +717,7 @@ public class SearchServiceImpl implements SearchService {
 		List<String> names = nameCns;
 		// 获取相似的英文品牌
 		List<String> nameEns = getSimilarValues(SearchConstants.BRAND_TABLE_NAME, SearchConstants.BRAND_NAMEEN_FIELD,
-                SearchConstants.BRAND_NAMEEN_UNTOKENIZED_FIELD, brandName, size);
+                SearchConstants.BRAND_NAMEEN_UNTOKENIZED_FIELD, brandName, size, false);
 		names.addAll(nameEns);
 		return names;
 	}
@@ -731,19 +731,21 @@ public class SearchServiceImpl implements SearchService {
 	 */
 	private List<String> getSimilarKindNames(String kindName, Integer size) {
 		return getSimilarValues(SearchConstants.KIND_TABLE_NAME, SearchConstants.KIND_NAMECN_FIELD,
-                SearchConstants.KIND_NAMECN_UNTOKENIZED_FIELD, kindName, size);
+                SearchConstants.KIND_NAMECN_UNTOKENIZED_FIELD, kindName, size, false);
 	}
 
-	/**
-	 * 根据输入值获取该域相似的值
-	 * 
-	 * @param tableName
-	 * @param field
-	 * @param keyword
-	 * @param size 指定的联想词数目
-	 * @return
-	 */
-	private List<String> getSimilarValues(String tableName, String field, String sortField, String keyword, Integer size) {
+    /**
+     * 根据输入值获取该域相似的值
+     *
+     * @param tableName      表名
+     * @param field          联想字段
+     * @param sortField      排序字段
+     * @param keyword        关键词
+     * @param size           联想词数目
+     * @param usePrefixQuery 是否使用 PrefixQuery
+     * @return 联想词
+     */
+    private List<String> getSimilarValues(String tableName, String field, String sortField, String keyword, Integer size, boolean usePrefixQuery) {
 		if (SearchUtils.isKeywordInvalid(keyword)) {
 			throw new SearchException("输入无效:" + keyword);
 		}
@@ -751,7 +753,12 @@ public class SearchServiceImpl implements SearchService {
 
 		List<String> result = new ArrayList<>();
 		try {
-			Query query = SearchUtils.getBooleanQuery(field, keyword);
+			Query query;
+            if(usePrefixQuery){
+                query = new PrefixQuery(new Term(field, keyword.toLowerCase()));
+            }else{
+                query = SearchUtils.getBooleanQuery(field, keyword);
+            }
 			logger.info(query.toString());
 			Sort sort = new Sort(new SortField(sortField, new StringFieldComparatorSource(keyword)));
 			TopDocs hits = indexSearcher.search(query, size, sort);