|
|
@@ -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<>();
|