Browse Source

修改联想词的搜索方式

sunyj 9 years ago
parent
commit
9a0e805c7d

+ 1 - 1
search-api/src/main/java/com/uas/search/service/SearchService.java

@@ -61,7 +61,7 @@ public interface SearchService {
 	 *            额外条件,可能带有翻页信息,filter中可以有:类目id(Long)、品牌id(Long)、属性过滤信息(Map(
 	 *            String,Object)可能过滤多个属性,,以属性id为键,以属性值为值)、库存是否不为0(Boolean)、
 	 *            现货数量是否不为0(Boolean)、呆滞库存数量是否不为0(Boolean)、样品数量是否不为0(Boolean),
-	 *            这些信息以键值对的形式进行传递,键为com. uas.search.utils. SearchConstants中的常量
+	 *            这些信息以键值对的形式进行传递,键为com.uas.search.utils.SearchConstants中的常量
 	 * @return
 	 * @throws SearchException
 	 */

+ 22 - 8
search-console/src/main/java/com/uas/search/console/service/impl/SearchServiceImpl.java

@@ -16,6 +16,7 @@ import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.NumericRangeQuery;
 import org.apache.lucene.search.PrefixQuery;
+import org.apache.lucene.search.Query;
 import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.TopDocs;
@@ -616,7 +617,7 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 	 */
 	private List<String> getSimilarComponentCodes(String componentCode) {
 		return getSimilarValues(SearchConstants.COMPONENT_TABLE_NAME, SearchConstants.COMPONENT_CODE_FIELD,
-				componentCode);
+				componentCode.toLowerCase(), QueryType.PREFIX_QUERY);
 	}
 
 	/**
@@ -628,7 +629,7 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 	private List<String> getSimilarBrandNames(String brandName) {
 		// 获取相似的中文品牌
 		List<String> nameCns = getSimilarValues(SearchConstants.BRAND_TABLE_NAME, SearchConstants.BRAND_NAMECN_FIELD,
-				brandName);
+				brandName, QueryType.BOOLEAN_QUERY);
 		// 相似的中文品牌数量足够,直接返回
 		if (nameCns != null && nameCns.size() == SIMILAR_NUM) {
 			return nameCns;
@@ -641,7 +642,7 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 
 		// 获取相似的英文品牌
 		List<String> nameEns = getSimilarValues(SearchConstants.BRAND_TABLE_NAME, SearchConstants.BRAND_NAMEEN_FIELD,
-				brandName);
+				brandName, QueryType.BOOLEAN_QUERY);
 		if (CollectionUtils.isEmpty(nameEns)) {
 			return names;
 		}
@@ -663,7 +664,12 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 	 * @return
 	 */
 	private List<String> getSimilarKindNames(String kindName) {
-		return getSimilarValues(SearchConstants.KIND_TABLE_NAME, SearchConstants.KIND_NAMECN_FIELD, kindName);
+		return getSimilarValues(SearchConstants.KIND_TABLE_NAME, SearchConstants.KIND_NAMECN_FIELD, kindName,
+				QueryType.BOOLEAN_QUERY);
+	}
+
+	private enum QueryType {
+		BOOLEAN_QUERY, PREFIX_QUERY
 	}
 
 	/**
@@ -674,17 +680,25 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
 	 * @param keyword
 	 * @return
 	 */
-	private List<String> getSimilarValues(String tableName, String field, String keyword) {
+	private List<String> getSimilarValues(String tableName, String field, String keyword, QueryType queryType) {
 		if (SearchUtils.isKeywordInvalid(keyword)) {
 			throw new SearchException("输入无效:" + keyword);
 		}
+		if (queryType == null) {
+			queryType = QueryType.BOOLEAN_QUERY;
+		}
 		IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(tableName);
 
 		List<String> result = new ArrayList<>();
 		try {
-			BooleanQuery booleanQuery = SearchUtils.getBooleanQuery(field, keyword);
-			logger.info(booleanQuery.toString());
-			TopDocs hits = indexSearcher.search(booleanQuery, SIMILAR_NUM);
+			Query query = null;
+			if (queryType == QueryType.BOOLEAN_QUERY) {
+				query = SearchUtils.getBooleanQuery(field, keyword);
+			} else if (queryType == QueryType.PREFIX_QUERY) {
+				query = new PrefixQuery(new Term(field, keyword));
+			}
+			logger.info(query.toString());
+			TopDocs hits = indexSearcher.search(query, SIMILAR_NUM);
 			ScoreDoc[] scoreDocs = hits.scoreDocs;
 			for (ScoreDoc scoreDoc : scoreDocs) {
 				Set<String> fieldsToLoad = new HashSet<>();