|
|
@@ -32,6 +32,12 @@ import com.uas.search.console.util.SearchConstants;
|
|
|
import com.uas.search.model.PageParams;
|
|
|
import com.uas.search.service.SearchService;
|
|
|
|
|
|
+/**
|
|
|
+ * 搜索索引
|
|
|
+ *
|
|
|
+ * @author sunyj
|
|
|
+ * @since 2016年8月5日 下午2:21:26
|
|
|
+ */
|
|
|
@Service
|
|
|
public class SearchServiceImpl implements SearchService {
|
|
|
|
|
|
@@ -82,6 +88,49 @@ public class SearchServiceImpl implements SearchService {
|
|
|
return ids;
|
|
|
}
|
|
|
|
|
|
+ public List<Map<String, Object>> getKinds(String keyword) {
|
|
|
+ if (isKeywordInvalid(keyword)) {
|
|
|
+ throw new IllegalArgumentException("搜索关键词无效");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Map<String, Object>> kinds = new ArrayList<Map<String, Object>>();
|
|
|
+ searcherManager.maybeReopen();
|
|
|
+ IndexSearcher searcher = searcherManager.get();
|
|
|
+ if (searcher == null) {
|
|
|
+ throw new RuntimeException("获取索引文件失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
+
|
|
|
+ @SuppressWarnings("resource")
|
|
|
+ Analyzer analyzer = new IKAnalyzer(true);
|
|
|
+ TokenStream tokenStream;
|
|
|
+ try {
|
|
|
+ tokenStream = analyzer.tokenStream(SearchConstants.KIND_NAMECN_FIELD, keyword);
|
|
|
+ tokenStream.reset();
|
|
|
+ CharTermAttribute cta = tokenStream.addAttribute(CharTermAttribute.class);
|
|
|
+ while (tokenStream.incrementToken()) {
|
|
|
+ Query query1 = new PrefixQuery(new Term(SearchConstants.KIND_NAMECN_FIELD, cta.toString()));
|
|
|
+ booleanQuery.add(query1, BooleanClause.Occur.MUST);
|
|
|
+ }
|
|
|
+
|
|
|
+ TopDocs hits = searcher.search(booleanQuery, TOP_NUM);
|
|
|
+ ScoreDoc[] scoreDocs = hits.scoreDocs;
|
|
|
+ for (ScoreDoc doc : scoreDocs) {
|
|
|
+ Document document = searcher.doc(doc.doc);
|
|
|
+ Map<String, Object> kind = new HashMap<String, Object>();
|
|
|
+ kind.put("id", Long.parseLong(document.get(SearchConstants.KIND_ID_FIELD)));
|
|
|
+ kind.put("nameCn", document.get(SearchConstants.KIND_NAMECN_FIELD));
|
|
|
+ kinds.add(kind);
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ searcherManager.release(searcher);
|
|
|
+ }
|
|
|
+ return kinds;
|
|
|
+ }
|
|
|
+
|
|
|
public List<Long> getBrandIds(String keyword) {
|
|
|
if (isKeywordInvalid(keyword)) {
|
|
|
throw new IllegalArgumentException("搜索关键词无效");
|
|
|
@@ -122,6 +171,49 @@ public class SearchServiceImpl implements SearchService {
|
|
|
return ids;
|
|
|
}
|
|
|
|
|
|
+ public List<Map<String, Object>> getBrands(String keyword) {
|
|
|
+ if (isKeywordInvalid(keyword)) {
|
|
|
+ throw new IllegalArgumentException("搜索关键词无效");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Map<String, Object>> brands = new ArrayList<Map<String, Object>>();
|
|
|
+ searcherManager.maybeReopen();
|
|
|
+ IndexSearcher searcher = searcherManager.get();
|
|
|
+ if (searcher == null) {
|
|
|
+ throw new RuntimeException("获取索引文件失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
+
|
|
|
+ @SuppressWarnings("resource")
|
|
|
+ Analyzer analyzer = new IKAnalyzer(true);
|
|
|
+ TokenStream tokenStream;
|
|
|
+ try {
|
|
|
+ tokenStream = analyzer.tokenStream(SearchConstants.BRAND_NAMECN_FIELD, keyword);
|
|
|
+ tokenStream.reset();
|
|
|
+ CharTermAttribute cta = tokenStream.addAttribute(CharTermAttribute.class);
|
|
|
+ while (tokenStream.incrementToken()) {
|
|
|
+ Query query1 = new PrefixQuery(new Term(SearchConstants.BRAND_NAMECN_FIELD, cta.toString()));
|
|
|
+ booleanQuery.add(query1, BooleanClause.Occur.MUST);
|
|
|
+ }
|
|
|
+ TopDocs hits = searcher.search(booleanQuery, TOP_NUM);
|
|
|
+ ScoreDoc[] scoreDocs = hits.scoreDocs;
|
|
|
+ for (ScoreDoc doc : scoreDocs) {
|
|
|
+ Document document = searcher.doc(doc.doc);
|
|
|
+ Map<String, Object> brand = new HashMap<String, Object>();
|
|
|
+ brand.put("id", Long.parseLong(document.get(SearchConstants.BRAND_ID_FIELD)));
|
|
|
+ brand.put("uuid", document.get(SearchConstants.BRAND_UUID_FIELD));
|
|
|
+ brand.put("nameCn", document.get(SearchConstants.BRAND_NAMECN_FIELD));
|
|
|
+ brands.add(brand);
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ searcherManager.release(searcher);
|
|
|
+ }
|
|
|
+ return brands;
|
|
|
+ }
|
|
|
+
|
|
|
public Map<String, Object> getComponentIds(String keyword, PageParams page) {
|
|
|
if (isKeywordInvalid(keyword)) {
|
|
|
throw new IllegalArgumentException("搜索关键词无效");
|
|
|
@@ -232,98 +324,29 @@ public class SearchServiceImpl implements SearchService {
|
|
|
return kindIds;
|
|
|
}
|
|
|
|
|
|
- public Set<Long> getBrandIdsBySearchComponent(String keyword, String kindId) {
|
|
|
- if (isKeywordInvalid(keyword)) {
|
|
|
- throw new IllegalArgumentException("搜索关键词无效");
|
|
|
+ public List<Map<String, Object>> getKindsBySearchComponent(String keyword, String brandId) {
|
|
|
+ Set<Long> kindIds = getKindIdsBySearchComponent(keyword, brandId);
|
|
|
+ List<Map<String, Object>> kinds = new ArrayList<Map<String, Object>>();
|
|
|
+ if (CollectionUtils.isEmpty(kindIds)) {
|
|
|
+ return kinds;
|
|
|
}
|
|
|
|
|
|
- Set<Long> brandIds = new HashSet<Long>();
|
|
|
searcherManager.maybeReopen();
|
|
|
IndexSearcher searcher = searcherManager.get();
|
|
|
if (searcher == null) {
|
|
|
throw new RuntimeException("获取索引文件失败");
|
|
|
}
|
|
|
|
|
|
+ BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
+ for (Long kindId : kindIds) {
|
|
|
+ booleanQuery.add(new TermQuery(new Term(SearchConstants.KIND_ID_FIELD, String.valueOf(kindId))),
|
|
|
+ BooleanClause.Occur.SHOULD);
|
|
|
+ }
|
|
|
try {
|
|
|
- BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
-
|
|
|
- keyword = URLDecoder.decode(keyword, "UTF-8");
|
|
|
- keyword = keyword.toLowerCase();
|
|
|
- PrefixQuery prefixQuery = new PrefixQuery(new Term(SearchConstants.COMPONENT_CODE_FIELD, keyword));
|
|
|
- booleanQuery.add(prefixQuery, BooleanClause.Occur.MUST);
|
|
|
-
|
|
|
- // 筛选类目
|
|
|
- if (!StringUtils.isEmpty(kindId)) {
|
|
|
- TermQuery kindQuery = new TermQuery(new Term(SearchConstants.COMPONENT_KINDID_FIELD, kindId));
|
|
|
- booleanQuery.add(kindQuery, BooleanClause.Occur.MUST);
|
|
|
- }
|
|
|
-
|
|
|
- TopDocs hits = searcher.search(booleanQuery, TOP_NUM);
|
|
|
- ScoreDoc[] scoreDocs = hits.scoreDocs;
|
|
|
+ TopDocs topDocs = searcher.search(booleanQuery, TOP_NUM);
|
|
|
+ ScoreDoc[] scoreDocs = topDocs.scoreDocs;
|
|
|
for (ScoreDoc scoreDoc : scoreDocs) {
|
|
|
Document document = searcher.doc(scoreDoc.doc);
|
|
|
- String cmp_brand_id = document.get(SearchConstants.COMPONENT_BRANDID_FIELD);
|
|
|
- if (!StringUtils.isEmpty(cmp_brand_id)) {
|
|
|
- brandIds.add(Long.parseLong(cmp_brand_id));
|
|
|
- }
|
|
|
- }
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- } finally {
|
|
|
- searcherManager.release(searcher);
|
|
|
- }
|
|
|
-
|
|
|
- return brandIds;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 判断搜索词是否为无效的(比如只包含特殊字符,不含有任何字母、数字、汉字等有意义的字符)
|
|
|
- *
|
|
|
- * @param keyword
|
|
|
- * @return
|
|
|
- */
|
|
|
- private boolean isKeywordInvalid(String keyword) {
|
|
|
- if (StringUtils.isEmpty(keyword)) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- // 将特殊字符剔除
|
|
|
- keyword = keyword.replaceAll("[`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]+", "");
|
|
|
- if (StringUtils.isEmpty(keyword)) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- public List<Map<String, Object>> getKinds(String keyword) {
|
|
|
- if (isKeywordInvalid(keyword)) {
|
|
|
- throw new IllegalArgumentException("搜索关键词无效");
|
|
|
- }
|
|
|
-
|
|
|
- List<Map<String, Object>> kinds = new ArrayList<Map<String, Object>>();
|
|
|
- searcherManager.maybeReopen();
|
|
|
- IndexSearcher searcher = searcherManager.get();
|
|
|
- if (searcher == null) {
|
|
|
- throw new RuntimeException("获取索引文件失败");
|
|
|
- }
|
|
|
-
|
|
|
- BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
-
|
|
|
- @SuppressWarnings("resource")
|
|
|
- Analyzer analyzer = new IKAnalyzer(true);
|
|
|
- TokenStream tokenStream;
|
|
|
- try {
|
|
|
- tokenStream = analyzer.tokenStream(SearchConstants.KIND_NAMECN_FIELD, keyword);
|
|
|
- tokenStream.reset();
|
|
|
- CharTermAttribute cta = tokenStream.addAttribute(CharTermAttribute.class);
|
|
|
- while (tokenStream.incrementToken()) {
|
|
|
- Query query1 = new PrefixQuery(new Term(SearchConstants.KIND_NAMECN_FIELD, cta.toString()));
|
|
|
- booleanQuery.add(query1, BooleanClause.Occur.MUST);
|
|
|
- }
|
|
|
-
|
|
|
- TopDocs hits = searcher.search(booleanQuery, TOP_NUM);
|
|
|
- ScoreDoc[] scoreDocs = hits.scoreDocs;
|
|
|
- for (ScoreDoc doc : scoreDocs) {
|
|
|
- Document document = searcher.doc(doc.doc);
|
|
|
Map<String, Object> kind = new HashMap<String, Object>();
|
|
|
kind.put("id", Long.parseLong(document.get(SearchConstants.KIND_ID_FIELD)));
|
|
|
kind.put("nameCn", document.get(SearchConstants.KIND_NAMECN_FIELD));
|
|
|
@@ -334,79 +357,44 @@ public class SearchServiceImpl implements SearchService {
|
|
|
} finally {
|
|
|
searcherManager.release(searcher);
|
|
|
}
|
|
|
+
|
|
|
return kinds;
|
|
|
}
|
|
|
|
|
|
- public List<Map<String, Object>> getBrands(String keyword) {
|
|
|
+ public Set<Long> getBrandIdsBySearchComponent(String keyword, String kindId) {
|
|
|
if (isKeywordInvalid(keyword)) {
|
|
|
throw new IllegalArgumentException("搜索关键词无效");
|
|
|
}
|
|
|
|
|
|
- List<Map<String, Object>> brands = new ArrayList<Map<String, Object>>();
|
|
|
+ Set<Long> brandIds = new HashSet<Long>();
|
|
|
searcherManager.maybeReopen();
|
|
|
IndexSearcher searcher = searcherManager.get();
|
|
|
if (searcher == null) {
|
|
|
throw new RuntimeException("获取索引文件失败");
|
|
|
}
|
|
|
|
|
|
- BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
-
|
|
|
- @SuppressWarnings("resource")
|
|
|
- Analyzer analyzer = new IKAnalyzer(true);
|
|
|
- TokenStream tokenStream;
|
|
|
try {
|
|
|
- tokenStream = analyzer.tokenStream(SearchConstants.BRAND_NAMECN_FIELD, keyword);
|
|
|
- tokenStream.reset();
|
|
|
- CharTermAttribute cta = tokenStream.addAttribute(CharTermAttribute.class);
|
|
|
- while (tokenStream.incrementToken()) {
|
|
|
- Query query1 = new PrefixQuery(new Term(SearchConstants.BRAND_NAMECN_FIELD, cta.toString()));
|
|
|
- booleanQuery.add(query1, BooleanClause.Occur.MUST);
|
|
|
- }
|
|
|
- TopDocs hits = searcher.search(booleanQuery, TOP_NUM);
|
|
|
- ScoreDoc[] scoreDocs = hits.scoreDocs;
|
|
|
- for (ScoreDoc doc : scoreDocs) {
|
|
|
- Document document = searcher.doc(doc.doc);
|
|
|
- Map<String, Object> brand = new HashMap<String, Object>();
|
|
|
- brand.put("id", Long.parseLong(document.get(SearchConstants.BRAND_ID_FIELD)));
|
|
|
- brand.put("uuid", document.get(SearchConstants.BRAND_UUID_FIELD));
|
|
|
- brand.put("nameCn", document.get(SearchConstants.BRAND_NAMECN_FIELD));
|
|
|
- brands.add(brand);
|
|
|
- }
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- } finally {
|
|
|
- searcherManager.release(searcher);
|
|
|
- }
|
|
|
- return brands;
|
|
|
- }
|
|
|
+ BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
|
|
|
- public List<Map<String, Object>> getKindsBySearchComponent(String keyword, String brandId) {
|
|
|
- Set<Long> kindIds = getKindIdsBySearchComponent(keyword, brandId);
|
|
|
- List<Map<String, Object>> kinds = new ArrayList<Map<String, Object>>();
|
|
|
- if (CollectionUtils.isEmpty(kindIds)) {
|
|
|
- return kinds;
|
|
|
- }
|
|
|
+ keyword = URLDecoder.decode(keyword, "UTF-8");
|
|
|
+ keyword = keyword.toLowerCase();
|
|
|
+ PrefixQuery prefixQuery = new PrefixQuery(new Term(SearchConstants.COMPONENT_CODE_FIELD, keyword));
|
|
|
+ booleanQuery.add(prefixQuery, BooleanClause.Occur.MUST);
|
|
|
|
|
|
- searcherManager.maybeReopen();
|
|
|
- IndexSearcher searcher = searcherManager.get();
|
|
|
- if (searcher == null) {
|
|
|
- throw new RuntimeException("获取索引文件失败");
|
|
|
- }
|
|
|
+ // 筛选类目
|
|
|
+ if (!StringUtils.isEmpty(kindId)) {
|
|
|
+ TermQuery kindQuery = new TermQuery(new Term(SearchConstants.COMPONENT_KINDID_FIELD, kindId));
|
|
|
+ booleanQuery.add(kindQuery, BooleanClause.Occur.MUST);
|
|
|
+ }
|
|
|
|
|
|
- BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
- for (Long kindId : kindIds) {
|
|
|
- booleanQuery.add(new TermQuery(new Term(SearchConstants.KIND_ID_FIELD, String.valueOf(kindId))),
|
|
|
- BooleanClause.Occur.SHOULD);
|
|
|
- }
|
|
|
- try {
|
|
|
- TopDocs topDocs = searcher.search(booleanQuery, TOP_NUM);
|
|
|
- ScoreDoc[] scoreDocs = topDocs.scoreDocs;
|
|
|
+ TopDocs hits = searcher.search(booleanQuery, TOP_NUM);
|
|
|
+ ScoreDoc[] scoreDocs = hits.scoreDocs;
|
|
|
for (ScoreDoc scoreDoc : scoreDocs) {
|
|
|
Document document = searcher.doc(scoreDoc.doc);
|
|
|
- Map<String, Object> kind = new HashMap<String, Object>();
|
|
|
- kind.put("id", Long.parseLong(document.get(SearchConstants.KIND_ID_FIELD)));
|
|
|
- kind.put("nameCn", document.get(SearchConstants.KIND_NAMECN_FIELD));
|
|
|
- kinds.add(kind);
|
|
|
+ String cmp_brand_id = document.get(SearchConstants.COMPONENT_BRANDID_FIELD);
|
|
|
+ if (!StringUtils.isEmpty(cmp_brand_id)) {
|
|
|
+ brandIds.add(Long.parseLong(cmp_brand_id));
|
|
|
+ }
|
|
|
}
|
|
|
} catch (IOException e) {
|
|
|
e.printStackTrace();
|
|
|
@@ -414,7 +402,7 @@ public class SearchServiceImpl implements SearchService {
|
|
|
searcherManager.release(searcher);
|
|
|
}
|
|
|
|
|
|
- return kinds;
|
|
|
+ return brandIds;
|
|
|
}
|
|
|
|
|
|
public List<Map<String, Object>> getBrandsBySearchComponent(String keyword, String kindId) {
|
|
|
@@ -455,4 +443,21 @@ public class SearchServiceImpl implements SearchService {
|
|
|
return brands;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 判断搜索词是否为无效的(比如只包含特殊字符,不含有任何字母、数字、汉字等有意义的字符)
|
|
|
+ *
|
|
|
+ * @param keyword
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean isKeywordInvalid(String keyword) {
|
|
|
+ if (StringUtils.isEmpty(keyword)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ // 将特殊字符剔除
|
|
|
+ keyword = keyword.replaceAll("[`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]+", "");
|
|
|
+ if (StringUtils.isEmpty(keyword)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|