From 28ae7f326574cae1dce302878079786a09e20451 Mon Sep 17 00:00:00 2001 From: super_liu <396572590@qq.com> Date: Mon, 23 May 2022 17:22:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20There=20is=20no=20way=20the,=20?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E4=B8=AD=E5=BF=83=20=E6=96=B0=E9=9C=80?= =?UTF-8?q?=E6=B1=82=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SearchCenterController.java | 18 +++-- .../da/search/entity/SeniorSearchInfoEO.java | 3 + .../search/service/SearchCenterService.java | 2 + .../service/impl/SearchCenterServiceImpl.java | 72 ++++++++++++++++++- 4 files changed, 85 insertions(+), 10 deletions(-) diff --git a/adc-da-search/src/main/java/com/adc/da/search/controller/SearchCenterController.java b/adc-da-search/src/main/java/com/adc/da/search/controller/SearchCenterController.java index a5c59070..9eea3a2d 100644 --- a/adc-da-search/src/main/java/com/adc/da/search/controller/SearchCenterController.java +++ b/adc-da-search/src/main/java/com/adc/da/search/controller/SearchCenterController.java @@ -84,15 +84,19 @@ public class SearchCenterController extends BaseController> 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()); diff --git a/adc-da-search/src/main/java/com/adc/da/search/entity/SeniorSearchInfoEO.java b/adc-da-search/src/main/java/com/adc/da/search/entity/SeniorSearchInfoEO.java index 9101420d..3e03c2f1 100644 --- a/adc-da-search/src/main/java/com/adc/da/search/entity/SeniorSearchInfoEO.java +++ b/adc-da-search/src/main/java/com/adc/da/search/entity/SeniorSearchInfoEO.java @@ -270,6 +270,9 @@ public class SeniorSearchInfoEO extends BasePage { private String NYLXCLASS; + @ApiModelProperty(value = "检索方式 : 全文检索 allTextSearch 、标题检索 titleSearch") + private String selectType; + } diff --git a/adc-da-search/src/main/java/com/adc/da/search/service/SearchCenterService.java b/adc-da-search/src/main/java/com/adc/da/search/service/SearchCenterService.java index 0fc72fc6..d6c4782f 100644 --- a/adc-da-search/src/main/java/com/adc/da/search/service/SearchCenterService.java +++ b/adc-da-search/src/main/java/com/adc/da/search/service/SearchCenterService.java @@ -30,6 +30,8 @@ public interface SearchCenterService { List> searchSarBykeyAndHighLightNumber(SeniorSearchInfoEO searchInfoEO) throws Exception; + List> searchSarBykeyAndHighLightNumberForTitle(SeniorSearchInfoEO searchInfoEO) throws Exception; + void searchByKey(CommonSearchInfoEO commonSearchInfoEO); } diff --git a/adc-da-search/src/main/java/com/adc/da/search/service/impl/SearchCenterServiceImpl.java b/adc-da-search/src/main/java/com/adc/da/search/service/impl/SearchCenterServiceImpl.java index 0d107ec0..1a700f17 100644 --- a/adc-da-search/src/main/java/com/adc/da/search/service/impl/SearchCenterServiceImpl.java +++ b/adc-da-search/src/main/java/com/adc/da/search/service/impl/SearchCenterServiceImpl.java @@ -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> searchSarBykeyAndHighLightNumberForTitle(SeniorSearchInfoEO searchInfoEO) throws Exception { + List> 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(""); + hiBuilder.postTags(""); + 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 sourceAsMap = searchHit.getSourceAsMap(); + //解析高亮字段 + Map 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> searchSarBykeyAndHighLightNumber(SeniorSearchInfoEO searchInfoEO) throws Exception { @@ -1535,10 +1593,18 @@ public class SearchCenterServiceImpl implements SearchCenterService { hiBuilder.postTags(""); 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());