feat: There is no way the, 搜索中心 新需求 优化

This commit is contained in:
super_liu
2022-05-23 17:22:46 +08:00
parent 4d82138c54
commit 28ae7f3265
4 changed files with 85 additions and 10 deletions
@@ -84,15 +84,19 @@ public class SearchCenterController extends BaseController<Map<String, Object>>
if (StringUtils.isAlphanumericSpace(searchInfoEO.getSelectIndex())) {
if(elasticsearchService.isIndexExist(searchInfoEO.getSelectIndex())){
if("fulltextserch".equals(searchInfoEO.getSelectIndex()) || "fulltextserch"== searchInfoEO.getSelectIndex()){
Pattern pattern = Pattern.compile("^[0-9a-zA-Z\\.\\(\\\\\\)\\s\\/\\-\\:]+$");
if (null != searchInfoEO.getSelectValue() && StringUtils.isNotBlank(searchInfoEO.getSelectValue())) {
if (pattern.matcher(searchInfoEO.getSelectValue()).matches()) {
result = searchCenterService.searchSarBykeyAndHighLightNumber(searchInfoEO);
}else {
if(StringUtils.isNotBlank(searchInfoEO.getSelectType()) && "titleSearch".equals(searchInfoEO.getSelectType())){
result = searchCenterService.searchSarBykeyAndHighLightNumberForTitle(searchInfoEO);
}else {
Pattern pattern = Pattern.compile("^[0-9a-zA-Z\\.\\(\\\\\\)\\s\\/\\-\\:]+$");
if (null != searchInfoEO.getSelectValue() && StringUtils.isNotBlank(searchInfoEO.getSelectValue())) {
if (pattern.matcher(searchInfoEO.getSelectValue()).matches()) {
result = searchCenterService.searchSarBykeyAndHighLightNumber(searchInfoEO);
}else {
result = searchCenterService.searchSarBykeyAndHighLight(searchInfoEO);
}
} else {
result = searchCenterService.searchSarBykeyAndHighLight(searchInfoEO);
}
} else {
result = searchCenterService.searchSarBykeyAndHighLight(searchInfoEO);
}
for (int i = 0; i < result.size(); i++) {
String collectId = personCollectEOService.queryCollectByUserAndId(result.get(i).get("id").toString());
@@ -270,6 +270,9 @@ public class SeniorSearchInfoEO extends BasePage {
private String NYLXCLASS;
@ApiModelProperty(value = "检索方式 : 全文检索 allTextSearch 、标题检索 titleSearch")
private String selectType;
}
@@ -30,6 +30,8 @@ public interface SearchCenterService {
List<Map<String, Object>> searchSarBykeyAndHighLightNumber(SeniorSearchInfoEO searchInfoEO) throws Exception;
List<Map<String, Object>> searchSarBykeyAndHighLightNumberForTitle(SeniorSearchInfoEO searchInfoEO) throws Exception;
void searchByKey(CommonSearchInfoEO commonSearchInfoEO);
}
@@ -1253,8 +1253,6 @@ public class SearchCenterServiceImpl implements SearchCenterService {
searchRequestBuilder = client.prepareSearch("fulltextserch")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.highlighter(hiBuilder)
.addSort("sortTitle.keyword",SortOrder.ASC)
.addSort("issue_time_order",SortOrder.DESC)
.setFrom((searchInfoEO.getPage()-1)*searchInfoEO.getPageSize())
.setSize(searchInfoEO.getPageSize());
@@ -1321,6 +1319,66 @@ public class SearchCenterServiceImpl implements SearchCenterService {
return result;
}
@Override
public List<Map<String, Object>> searchSarBykeyAndHighLightNumberForTitle(SeniorSearchInfoEO searchInfoEO) throws Exception {
List<Map<String, Object>> result = new ArrayList<>();
SearchRequestBuilder searchRequestBuilder;
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 记录搜索记录到数据库中
BoolQueryBuilder boolQueryShould = QueryBuilders.boolQuery();
BoolQueryBuilder boolQueryMust = QueryBuilders.boolQuery();
QueryBuilder multiQueryBuilder;
QueryBuilder multiQueryBuilder1;
QueryBuilder queryBuilder1 = QueryBuilders.multiMatchQuery("");
queryBuilder1 = QueryBuilders.multiMatchQuery(searchInfoEO.getSelectValue(),
"sortTitle","numberTitle","yearOrder","nameTitle","title"
).minimumShouldMatch("100%").field("sortTitle",1005f).field("numberTitle",1004f).field("yearOrder",1003f).field("nameTitle",1002f).field("title",1000f);
boolQueryBuilder.must(queryBuilder1);
//在结果中检索
HighlightBuilder hiBuilder=new HighlightBuilder();
HighlightBuilder.Field highlightTitle = new HighlightBuilder.Field("title");
hiBuilder.field(highlightTitle);
hiBuilder.preTags("<span class='highlight-class'>");
hiBuilder.postTags("</span>");
updateIndex("fulltextserch");
//1.按照资源库分类排序可实现数据的第一层排序(增加资源库自定义顺序标记,按标记排序)
//2.标准类别根据资源库分类基础上进行第二层排序(需提前维护标准类别的自定义顺序)
//3.标准编号则在标准类别的基础上进行第三层排序(此类排序针对国标、企标等规范类数据,海外标准由于历史数据不规范,可能会影响到检索的实际效果)
//4.标准年份为第四层排序规则
searchRequestBuilder = client.prepareSearch("fulltextserch")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.highlighter(hiBuilder)
.addSort("standTypeOrder",SortOrder.ASC)
.addSort("standSortOrder",SortOrder.ASC)
.addSort("numberTitle",SortOrder.ASC)
.addSort("yearOrder",SortOrder.DESC)
.addSort("sortTitle.keyword",SortOrder.ASC)
.setFrom((searchInfoEO.getPage()-1)*searchInfoEO.getPageSize())
.setSize(searchInfoEO.getPageSize());
searchRequestBuilder.setQuery(boolQueryBuilder).setTrackTotalHits(true);
SearchResponse response = searchRequestBuilder.get();
for (SearchHit searchHit : response.getHits().getHits()) {
searchHit.getSourceAsMap().put("id", searchHit.getId());
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
//解析高亮字段
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
HighlightField field= highlightFields.get("title");
if(field!= null){
Text[] fragments = field.fragments();
String n_field = "";
for (Text fragment : fragments) {
n_field += fragment;
}
//高亮标题覆盖原标题
sourceAsMap.put("title",n_field);
}
result.add(sourceAsMap);
}
searchInfoEO.getPager().setRowCount((int) response.getHits().getTotalHits().value);
return result;
}
@Override
public List<Map<String, Object>> searchSarBykeyAndHighLightNumber(SeniorSearchInfoEO searchInfoEO) throws Exception {
@@ -1535,10 +1593,18 @@ public class SearchCenterServiceImpl implements SearchCenterService {
hiBuilder.postTags("</span>");
updateIndex("fulltextserch");
//1.按照资源库分类排序可实现数据的第一层排序(增加资源库自定义顺序标记,按标记排序)
//2.标准类别根据资源库分类基础上进行第二层排序(需提前维护标准类别的自定义顺序)
//3.标准编号则在标准类别的基础上进行第三层排序(此类排序针对国标、企标等规范类数据,海外标准由于历史数据不规范,可能会影响到检索的实际效果)
//4.标准年份为第四层排序规则
searchRequestBuilder = client.prepareSearch("fulltextserch")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.highlighter(hiBuilder)
.addSort("issue_time_order",SortOrder.DESC)
.addSort("standTypeOrder",SortOrder.ASC)
.addSort("standSortOrder",SortOrder.ASC)
.addSort("numberTitle",SortOrder.ASC)
.addSort("yearOrder",SortOrder.DESC)
.addSort("sortTitle.keyword",SortOrder.ASC)
.setFrom((searchInfoEO.getPage()-1)*searchInfoEO.getPageSize())
.setSize(searchInfoEO.getPageSize());