pom 引入依赖:
<!-- elasticsearch 7.16 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
package com.realize.framework.config; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Author hzj * @Date 2022/1/6 13:33 * @Desc ElasticSearch配置 **/ @Configuration public class ElasticSearchClientConfig { @Value("${spring.elasticsearch.ip}") private String ip; @Bean public RestHighLevelClient restHighLevelClient() { RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost(ip, 9200, "http"))); return restHighLevelClient; } }
yml:
# ES 地址
spring elasticsearch: ip: 47.101.207.23
package com.realize.project.system.service.impl; import com.alibaba.fastjson.JSON; import com.realize.common.constant.Constants; import com.realize.common.constant.HttpStatus; import com.realize.common.utils.StringUtils; import com.realize.framework.convert.PdfConvertTxtComponent; import com.realize.framework.redis.RedisCache; import com.realize.framework.upLoad.AliYunOSSService; import com.realize.framework.web.page.TableNoticeDataInfo; import com.realize.project.system.domain.AshareMain; import com.realize.project.system.domain.AshareOwnership; import com.realize.project.system.domain.BusiPublicNotice; import com.realize.project.system.domain.OssMetaGq; import com.realize.project.system.domain.dto.EnumSecDto; import com.realize.project.system.domain.vo.BusiPublicNoticeReqVo; import com.realize.project.system.domain.vo.PublicNoticeClassifyReqVo; import com.realize.project.system.domain.vo.PublicNoticeMapVo; import com.realize.project.system.mapper.BusiPublicNoticeMapper; import com.realize.project.system.service.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.master.AcknowledgedResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.indices.CreateIndexRequest; import org.elasticsearch.client.indices.CreateIndexResponse; import org.elasticsearch.client.indices.GetIndexRequest; import org.elasticsearch.common.text.Text; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.*; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; import org.elasticsearch.search.sort.FieldSortBuilder; import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; /** * 股权激励公告Service业务层处理 * * @author realize * @date 2022-04-15 */ @Slf4j @Service public class BusiPublicNoticeServiceImpl implements IBusiPublicNoticeService { //全局用-公告检索ES索引库 private static final String clusterName="public_notice"; @Autowired private BusiPublicNoticeMapper busiPublicNoticeMapper; @Autowired private RestHighLevelClient restHighLevelClient; @Autowired private SqlSessionFactory sqlSessionFactory; @Autowired private PdfConvertTxtComponent pdfConvertTxtComponent; @Autowired private AliYunOSSService aliyunOSSService; @Autowired private IEnumSecService enumSecService; @Autowired private IAshareMainService ashareMainService; @Autowired private IAshareOwnershipService ashareOwnershipService; @Autowired private IOssMetaGqService ossMetaGqService; @Autowired private RedisCache redisCache; /** * ES 查询共用条件 * @Description ES 公告检索 * @param publicNoticeReqVo * @return List<Map<String,Object>> 公告检索结果集 * @return */ public SearchResponse commonConditions(BusiPublicNoticeReqVo publicNoticeReqVo){ //创建索引请求 SearchRequest searchRequest = new SearchRequest(clusterName); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); //按照省份分组 AggregationBuilder aggregationBuilder = AggregationBuilders.terms("agg").field("region.keyword"); searchSourceBuilder.aggregation(aggregationBuilder); //按照父行业/行业分组 AggregationBuilder parentindustryAggregationBuilder = AggregationBuilders.terms("aggParentindustry").field("parentindustry.keyword"); AggregationBuilder industryAggregationBuilder = AggregationBuilders.terms("aggIndustry").field("industry.keyword"); parentindustryAggregationBuilder.subAggregation(industryAggregationBuilder); searchSourceBuilder.aggregation(parentindustryAggregationBuilder); //按照市场类型分组 AggregationBuilder marketcodeAggregationBuilder = AggregationBuilders.terms("aggMarketcode").field("markettype.keyword"); searchSourceBuilder.aggregation(marketcodeAggregationBuilder); //按照公告分类分组 AggregationBuilder noticetypeAggregationBuilder = AggregationBuilders.terms("aggNoticetype").field("noticetype.keyword"); searchSourceBuilder.aggregation(noticetypeAggregationBuilder); //初始化每个字段的属性 RangeQueryBuilder publishdateQuery = null; MatchPhraseQueryBuilder theValidityTQ = null;//不分词 TermsQueryBuilder termsQueryTQ=null;//会分词 //1发布时间 if (publicNoticeReqVo.getPublishdates()!=null && publicNoticeReqVo.getPublishdates().size()>0) { publishdateQuery = QueryBuilders.rangeQuery("publishdate") .gte(publicNoticeReqVo.getPublishdates().get(0).getTime()) .lte(publicNoticeReqVo.getPublishdates().get(1).getTime()); boolQueryBuilder.must(publishdateQuery); } //2证券代码 if (StringUtils.isNotBlank(publicNoticeReqVo.getStockcode())) { //matchPhraseQuery不分词 theValidityTQ = QueryBuilders.matchPhraseQuery("stockcode",publicNoticeReqVo.getStockcode()); boolQueryBuilder.must(theValidityTQ); } //市场类型 if (StringUtils.isNotBlank(publicNoticeReqVo.getMarketcode())) { //matchPhraseQuery不分词 theValidityTQ = QueryBuilders.matchPhraseQuery("marketcode",publicNoticeReqVo.getMarketcode()); boolQueryBuilder.must(theValidityTQ); } //公司性质 if (StringUtils.isNotBlank(publicNoticeReqVo.getOwnership())) { //matchPhraseQuery不分词 theValidityTQ = QueryBuilders.matchPhraseQuery("ownershipcode",publicNoticeReqVo.getOwnership()); boolQueryBuilder.must(theValidityTQ); } //公告类型-查询股权激励tab页数据 if (StringUtils.isNotBlank(publicNoticeReqVo.getNoticecode())) { //matchPhraseQuery不分词 theValidityTQ = QueryBuilders.matchPhraseQuery("noticecode",publicNoticeReqVo.getNoticecode()); boolQueryBuilder.must(theValidityTQ); } //业务类型-查询股权激励tab页数据 if (StringUtils.isNotBlank(publicNoticeReqVo.getCustomcode())) { //matchPhraseQuery不分词 theValidityTQ = QueryBuilders.matchPhraseQuery("customcode",publicNoticeReqVo.getCustomcode()); boolQueryBuilder.must(theValidityTQ); } List<PublicNoticeClassifyReqVo> classifyArr = publicNoticeReqVo.getClassifyArr(); if(CollectionUtils.isNotEmpty(classifyArr)){ List<String> parentIndustry0 = classifyArr.stream().filter(b -> b.getParentIndustryPlus()!=null && b.getParentIndustryPlus() == 0).map(b->b.getParentIndustry()).collect(Collectors.toList()); List<String> parentIndustry1 = classifyArr.stream().filter(b -> b.getParentIndustryPlus()!=null && b.getParentIndustryPlus() == 1).map(b->b.getParentIndustry()).collect(Collectors.toList()); //父行业分类 加减查询; if(CollectionUtils.isNotEmpty(parentIndustry0)){ termsQueryTQ = QueryBuilders.termsQuery("parentindustry.keyword", parentIndustry0); boolQueryBuilder.mustNot(termsQueryTQ); } if(CollectionUtils.isNotEmpty(parentIndustry1)){ termsQueryTQ = QueryBuilders.termsQuery("parentindustry.keyword", parentIndustry1); boolQueryBuilder.must(termsQueryTQ); } //行业分类 加减查询; List<String> industry0 = classifyArr.stream().filter(b -> b.getIndustryPlus() != null && b.getIndustryPlus() == 0).map(b->b.getIndustry()).collect(Collectors.toList()); List<String> industry1 = classifyArr.stream().filter(b -> b.getIndustryPlus() != null && b.getIndustryPlus() == 1).map(b->b.getIndustry()).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(industry0)){ termsQueryTQ = QueryBuilders.termsQuery("industry.keyword", industry0); boolQueryBuilder.mustNot(termsQueryTQ); } if(CollectionUtils.isNotEmpty(industry1)){ termsQueryTQ = QueryBuilders.termsQuery("industry.keyword", industry1); boolQueryBuilder.must(termsQueryTQ); } //区域分布 加减查询; List<String> region0 = classifyArr.stream().filter(b -> b.getRegionPlus() !=null && b.getRegionPlus() == 0).map(b->b.getRegion()).collect(Collectors.toList()); List<String> region1 = classifyArr.stream().filter(b -> b.getRegionPlus() !=null && b.getRegionPlus() == 1).map(b->b.getRegion()).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(region0)){ termsQueryTQ = QueryBuilders.termsQuery("region.keyword", region0); boolQueryBuilder.mustNot(termsQueryTQ); } if(CollectionUtils.isNotEmpty(region1)){ termsQueryTQ = QueryBuilders.termsQuery("region.keyword", region1); boolQueryBuilder.must(termsQueryTQ); } //市场类型 加减查询; List<String> marketType0 = classifyArr.stream().filter(b -> b.getMarketTypePlus()!=null && b.getMarketTypePlus() == 0).map(b->b.getMarketType()).collect(Collectors.toList()); List<String> marketType1 = classifyArr.stream().filter(b -> b.getMarketTypePlus()!=null && b.getMarketTypePlus() == 1).map(b->b.getMarketType()).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(marketType0)){ termsQueryTQ = QueryBuilders.termsQuery("markettype.keyword", marketType0); boolQueryBuilder.mustNot(termsQueryTQ); } if(CollectionUtils.isNotEmpty(marketType1)){ termsQueryTQ = QueryBuilders.termsQuery("markettype.keyword", marketType1); boolQueryBuilder.must(termsQueryTQ); } //公告类型 加减查询; List<String> noticeType0 = classifyArr.stream().filter(b -> b.getNoticeTypePlus()!=null && b.getNoticeTypePlus() == 0).map(b->b.getNoticeType()).collect(Collectors.toList()); List<String> noticeType1 = classifyArr.stream().filter(b -> b.getNoticeTypePlus()!=null && b.getNoticeTypePlus() == 1).map(b->b.getNoticeType()).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(noticeType0)){ termsQueryTQ = QueryBuilders.termsQuery("noticetype.keyword", noticeType0); boolQueryBuilder.mustNot(termsQueryTQ); } if(CollectionUtils.isNotEmpty(noticeType1)){ termsQueryTQ = QueryBuilders.termsQuery("noticetype.keyword", noticeType1); boolQueryBuilder.must(termsQueryTQ); } } //3-1标题-包含全部关键字 使用should需要再套一个bool must=and 和 should=or if (StringUtils.isNotBlank(publicNoticeReqVo.getTitle())) { String[] strings = publicNoticeReqVo.getTitle().split(" ");//输入多个关键字 以空格区分 if(publicNoticeReqVo.getScope()!=null&&publicNoticeReqVo.getScope()==1) {//0同篇;不限制范围 BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); for (int i = 0; i < strings.length; i++) { boolQueryBuilder.must(boolQueryBuilder1.must(QueryBuilders.matchPhraseQuery("title",strings[i]))); } }else {//跨度查询 同段同句;限制范围 SpanNearQueryBuilder queryBuilderSpanNearQueryInclude = QueryBuilders.spanNearQuery(QueryBuilders.spanTermQuery("title", strings[0]), 10000); for (int i = 1; i < strings.length; i++) { queryBuilderSpanNearQueryInclude.addClause(QueryBuilders.spanTermQuery("title", strings[i])); } SpanTermQueryBuilder queryBuilderSpanNearQueryExclude=null; if(publicNoticeReqVo.getScope()!=null&&publicNoticeReqVo.getScope()==2){//同段搜素类似,相邻搜索不能有: 对应分隔符变为 \n,或者 同段搜素类似,对应分隔符变为\n,或者<p>,</p> queryBuilderSpanNearQueryExclude = QueryBuilders.spanTermQuery("title", "\n/<p>"); }else if(publicNoticeReqVo.getScope()!=null&&publicNoticeReqVo.getScope()==3){//同句搜素类似,相邻搜索不能有: 对应分隔符变为 。 、?、! queryBuilderSpanNearQueryExclude = QueryBuilders.spanTermQuery("title", "。/?/!"); }else if(publicNoticeReqVo.getScope()!=null&&publicNoticeReqVo.getScope()==4){ queryBuilderSpanNearQueryExclude = QueryBuilders.spanTermQuery("title", "。/?/!/不构成/不包含"); } //QueryBuilder queryBuilderSpanNotQuery= QueryBuilders.spanNotQuery(queryBuilderSpanNearQueryInclude,queryBuilderSpanNearQueryExclude); //.include().exclude(); } } //3-2标题-包含任一全部关键字 使用should需要再套一个bool must=and 和 should=or if (StringUtils.isNotBlank(publicNoticeReqVo.getContainAnyTitle())) { BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); String[] strings = publicNoticeReqVo.getContainAnyTitle().split(" "); //输入多个关键字 以空格区分 for (int i = 0; i < strings.length; i++) { boolQueryBuilder.must(boolQueryBuilder1.should(QueryBuilders.matchPhraseQuery("title",strings[i]))); } } //3-3标题-不包含任一全部关键字 使用should需要再套一个bool must=and 和 should=or if (StringUtils.isNotBlank(publicNoticeReqVo.getNoContainAnyTitle())) { BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); String[] strings = publicNoticeReqVo.getNoContainAnyTitle().split(" "); //输入多个关键字 以空格区分 for (int i = 0; i < strings.length; i++) { boolQueryBuilder.must(boolQueryBuilder1.mustNot(QueryBuilders.matchPhraseQuery("title",strings[i]))); } } //4-1章节 包含全部关键字 使用should需要再套一个bool if (StringUtils.isNotBlank(publicNoticeReqVo.getChapter())) { BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); String[] split = publicNoticeReqVo.getChapter().split(" "); //输入多个关键字 以空格区分 for (int i = 0; i < split.length; i++) { boolQueryBuilder.must(boolQueryBuilder1.must(QueryBuilders.matchPhraseQuery("parseChapter",split[i]))); } } //4-2章节 包含任一全部关键字 使用should需要再套一个bool if (StringUtils.isNotBlank(publicNoticeReqVo.getContainAnyChapter())) { BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); String[] split = publicNoticeReqVo.getContainAnyChapter().split(" "); //输入多个关键字 以空格区分 //使用should需要再套一个bool for (int i = 0; i < split.length; i++) { boolQueryBuilder.must(boolQueryBuilder1.should(QueryBuilders.matchPhraseQuery("parseChapter",split[i]))); } } //4-3章节 不包含任一全部关键字 使用should需要再套一个bool if (StringUtils.isNotBlank(publicNoticeReqVo.getNoContainAnyChapter())) { BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); String[] split = publicNoticeReqVo.getNoContainAnyChapter().split(" "); //输入多个关键字 以空格区分 //使用should需要再套一个bool for (int i = 0; i < split.length; i++) { boolQueryBuilder.must(boolQueryBuilder1.mustNot(QueryBuilders.matchPhraseQuery("parseChapter",split[i]))); } } //5正文 包含全部关键字 使用should需要再套一个bool QueryBuilder queryBuilderSpanNotQuery=null; if (StringUtils.isNotBlank(publicNoticeReqVo.getFullText())) { String[] split = publicNoticeReqVo.getFullText().split(" "); //输入多个关键字 以空格区分 if(publicNoticeReqVo.getScope()!=null&&publicNoticeReqVo.getScope()==1) {//0同篇;不限制范围 BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); for (int i = 0; i < split.length; i++) { boolQueryBuilder.must(boolQueryBuilder1.must(QueryBuilders.matchPhraseQuery("parseContent",split[i]))); } }else {//跨度查询 同段同句;限制范围 SpanNearQueryBuilder queryBuilderSpanNearQueryInclude = QueryBuilders.spanNearQuery(QueryBuilders.spanTermQuery("parseContent", split[0]), 10000); for (int i = 1; i < split.length; i++) { queryBuilderSpanNearQueryInclude.addClause(QueryBuilders.spanTermQuery("parseContent", split[i])); } SpanTermQueryBuilder queryBuilderSpanNearQueryExclude=null; if(publicNoticeReqVo.getScope()!=null&&publicNoticeReqVo.getScope()==2){//同段搜素类似,相邻搜索不能有:对应分隔符变为 \n,或者 , queryBuilderSpanNearQueryExclude = QueryBuilders.spanTermQuery("parseContent", "\n/,/,"); }else if(publicNoticeReqVo.getScope()!=null&&publicNoticeReqVo.getScope()==3){//同句搜素类似,相邻搜索不能有:对应分隔符变为 。 、?、! queryBuilderSpanNearQueryExclude = QueryBuilders.spanTermQuery("parseContent", "。/?/!"); }else if(publicNoticeReqVo.getScope()!=null&&publicNoticeReqVo.getScope()==4){ queryBuilderSpanNearQueryExclude = QueryBuilders.spanTermQuery("parseContent", "。/?/!/不构成/不包含"); } queryBuilderSpanNotQuery= QueryBuilders.spanNotQuery(queryBuilderSpanNearQueryInclude,queryBuilderSpanNearQueryExclude); //.include().exclude(); //boolQueryBuilder.must(queryBuilderSpanNotQuery); } } //5正文 包含任一全部关键字 使用should需要再套一个bool if (StringUtils.isNotBlank(publicNoticeReqVo.getContainAnyFullText())) { BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); String[] split = publicNoticeReqVo.getContainAnyFullText().split(" "); //输入多个关键字 以空格区分 for (int i = 0; i < split.length; i++) { boolQueryBuilder.must(boolQueryBuilder1.should(QueryBuilders.matchPhraseQuery("parseContent",split[i]))); } } //5正文 不包含任一全部关键字 使用should需要再套一个bool if (StringUtils.isNotBlank(publicNoticeReqVo.getNoContainAnyFullText())) { BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); String[] split = publicNoticeReqVo.getNoContainAnyFullText().split(" "); //输入多个关键字 以空格区分 for (int i = 0; i < split.length; i++) { boolQueryBuilder.must(boolQueryBuilder1.mustNot(QueryBuilders.matchPhraseQuery("parseContent",split[i]))); } } //全文高亮 标题高亮 if (StringUtils.isNotBlank(publicNoticeReqVo.getTitle()) || StringUtils.isNotBlank(publicNoticeReqVo.getContainAnyTitle())||StringUtils.isNotBlank(publicNoticeReqVo.getNoContainAnyTitle()) || StringUtils.isNotBlank(publicNoticeReqVo.getFullText())) { //实例化高亮构建器 HighlightBuilder highlightBuilder = new HighlightBuilder(); //需要高亮的字段(可多个) highlightBuilder.field("title").field("parseContent"); highlightBuilder.requireFieldMatch(true); //最大高亮分片数,没有这个配置就会导致全文显示不全问题 highlightBuilder.fragmentSize(800000); //从第一个分片获取高亮片段,没有这个配置就会导致全文显示不全问题 highlightBuilder.numOfFragments(0); //前缀 highlightBuilder.preTags("<span style='font-weight: bolder;color:red'>"); //后缀 highlightBuilder.postTags("</span>"); //添加查询构建器中,形成查询 searchSourceBuilder.highlighter(highlightBuilder); } Integer pageNum = publicNoticeReqVo.getPageNum(); Integer pageSize = publicNoticeReqVo.getPageSize(); //分页 if(pageNum<=0){ pageNum = 1; } if(pageSize<=0){ pageSize=10; } //起始记录下标 int from = (pageNum-1) * pageSize; searchSourceBuilder.from(from); searchSourceBuilder.size(pageSize); //排序规则: if(StringUtils.isNotBlank(publicNoticeReqVo.getSortField())){//公司聚合 FieldSortBuilder fieldSortBuilder1 = new FieldSortBuilder("stockticker.keyword").order(SortOrder.ASC); searchSourceBuilder.sort(fieldSortBuilder1); FieldSortBuilder fieldSortBuilder2 = new FieldSortBuilder("publishdate").order(SortOrder.DESC); searchSourceBuilder.sort(fieldSortBuilder2); }else{//最近,最早; FieldSortBuilder fieldSortBuilder = new FieldSortBuilder("publishdate").order(publicNoticeReqVo.getSortDirection()!=null && publicNoticeReqVo.getSortDirection()==0?SortOrder.ASC:SortOrder.DESC); searchSourceBuilder.sort(fieldSortBuilder); } //执行查询 if(queryBuilderSpanNotQuery!=null){ searchSourceBuilder.query(queryBuilderSpanNotQuery); }else{ searchSourceBuilder.query(boolQueryBuilder); } //打印 System.out.println("打印方便核查的ES检索条件: " + searchSourceBuilder.toString()); //不能超过60秒 searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); //限制查询最大数 searchSourceBuilder.trackTotalHits(true); //检索 searchRequest.source(searchSourceBuilder); //客户端调用检索语法 SearchResponse searchResponse = null; try { searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } return searchResponse; } /** * @Description ES 公告检索 * @param publicNoticeReqVo * @return List<Map<String,Object>> 公告检索结果集 **/ @Override public TableNoticeDataInfo getEsBusiPublicNotice(BusiPublicNoticeReqVo publicNoticeReqVo) { SearchResponse searchResponse = this.commonConditions(publicNoticeReqVo); //获取响应结果 SearchHits hits = searchResponse.getHits(); //记录查询后总数 Long totalHits = hits.getTotalHits().value; // System.out.println("命中数:" + totalHits); SearchHit[] hitss = searchResponse.getHits().getHits(); // System.out.println("命中:" + hitss.length); //数据结果集初始化 List<Map<String, Object>> list = new ArrayList<>(); //循环存入结果集 for (SearchHit hit : searchResponse.getHits().getHits()) { //理因判断不为空才让加前后缀 if (StringUtils.isNotBlank(publicNoticeReqVo.getTitle()) || StringUtils.isNotBlank(publicNoticeReqVo.getContainAnyTitle())||StringUtils.isNotBlank(publicNoticeReqVo.getNoContainAnyTitle()) ||StringUtils.isNotBlank(publicNoticeReqVo.getFullText())) { //设置标题高亮 Map<String, HighlightField> titlehighlightFields = hit.getHighlightFields(); HighlightField titleHight = titlehighlightFields.get("title"); Map<String, Object> sourceAsMap = hit.getSourceAsMap(); String contentInfo = (String) sourceAsMap.get("title"); //标题-高亮词替换 if (titleHight != null ){ Text[] fragments = titleHight.fragments(); StringBuilder newtitle = new StringBuilder(); for (Text text:fragments) { newtitle.append(text); } sourceAsMap.replace("title", newtitle); } //设置全文高亮 Map<String, HighlightField> fullTexthighlightFields = hit.getHighlightFields(); HighlightField fullTextHight = fullTexthighlightFields.get("parseContent"); //全文-高亮词替换 if (fullTextHight != null ){ Text[] fragments = fullTextHight.getFragments(); StringBuilder newfullText = new StringBuilder(); for (Text text:fragments) { newfullText.append(text); } // String strc = contentInfo.replace(fullText,preTags+ fullText +postTags); // sourceAsMap.put("contentInfo", strc); sourceAsMap.replace("contentInfo", newfullText); } list.add(sourceAsMap); } else { //否则直接添加进结果集,不需要高亮 list.add(hit.getSourceAsMap()); } } //System.out.println("结果集长度:" + list.size()); //获取聚合结果集 //按照省份分组 List<PublicNoticeMapVo> listRegionsMap=new ArrayList(); Terms terms = searchResponse.getAggregations().get("agg"); for (Terms.Bucket entry : terms.getBuckets()) { PublicNoticeMapVo publicNoticeMapVo=new PublicNoticeMapVo(); publicNoticeMapVo.setName(entry.getKey().toString()); publicNoticeMapVo.setCount(entry.getDocCount()); listRegionsMap.add(publicNoticeMapVo); } //按照父行业分组 List<PublicNoticeMapVo> listIndustryMap=new ArrayList(); Terms terms2 = searchResponse.getAggregations().get("aggParentindustry"); for (Terms.Bucket entry : terms2.getBuckets()) { PublicNoticeMapVo publicNoticeMapVo=new PublicNoticeMapVo(); publicNoticeMapVo.setName(entry.getKey().toString()); publicNoticeMapVo.setCount(entry.getDocCount()); List<PublicNoticeMapVo> listSonIndustryMap=new ArrayList(); Terms towTerms = (Terms) entry.getAggregations().asMap().get("aggIndustry"); for (Terms.Bucket entryTwo : towTerms.getBuckets()) { PublicNoticeMapVo publicNoticeMapSonVo=new PublicNoticeMapVo(); publicNoticeMapSonVo.setName(entryTwo.getKey().toString()); publicNoticeMapSonVo.setCount(entryTwo.getDocCount()); listSonIndustryMap.add(publicNoticeMapSonVo); } publicNoticeMapVo.setSonArray(listSonIndustryMap); listIndustryMap.add(publicNoticeMapVo); } //按照市场类型分组 List<PublicNoticeMapVo> listMarketcodesMap=new ArrayList(); Terms terms3 = searchResponse.getAggregations().get("aggMarketcode"); for (Terms.Bucket entry : terms3.getBuckets()) { PublicNoticeMapVo publicNoticeMapVo=new PublicNoticeMapVo(); publicNoticeMapVo.setName(entry.getKey().toString()); publicNoticeMapVo.setCount(entry.getDocCount()); listMarketcodesMap.add(publicNoticeMapVo); } //按照公告类型分组 List<PublicNoticeMapVo> listNoticetypeMap=new ArrayList(); Terms terms4 = searchResponse.getAggregations().get("aggNoticetype"); for (Terms.Bucket entry : terms4.getBuckets()) { PublicNoticeMapVo publicNoticeMapVo=new PublicNoticeMapVo(); publicNoticeMapVo.setName(entry.getKey().toString()); publicNoticeMapVo.setCount(entry.getDocCount()); listNoticetypeMap.add(publicNoticeMapVo); } //获取响应结果 //SearchHits hits = searchResponse.getHits(); //Long totalHits = hits.getTotalHits().value; TableNoticeDataInfo rspData = new TableNoticeDataInfo(); rspData.setCode(HttpStatus.SUCCESS); rspData.setMsg("查询成功"); rspData.setRows(list); rspData.setTotal(totalHits); rspData.setMapRegions(listRegionsMap); rspData.setMapParentIndustrycodes(listIndustryMap); rspData.setMapMarketcodes(listMarketcodesMap); rspData.setMapNoticetypes(listNoticetypeMap); return rspData; } /** * @Description ES 公告检索 * @param publicNoticeReqVo * @return List<Map<String,Object>> 公告检索结果集 * @return int 命中条数 **/ @Override public Long getEsTotal(BusiPublicNoticeReqVo publicNoticeReqVo) { SearchResponse searchResponse = this.commonConditions(publicNoticeReqVo); //获取响应结果 SearchHits hits = searchResponse.getHits(); Long totalHits = hits.getTotalHits().value; //记录总数 // System.out.println("命中数:"+totalHits); //返回总记录数 return totalHits; } @Override public void insertBatchBusiPublicNotice(List<BusiPublicNotice> noticeList) { busiPublicNoticeMapper.insertBatchBusiPublicNotice(noticeList); } @Override public int updateAnnouncementOSSUrl(BusiPublicNotice busiPublicNoticeDto) { return busiPublicNoticeMapper.updateAnnouncementOSSUrl(busiPublicNoticeDto); } /** * 前端显示 地域分布 分组 * @param publicNoticeReqVo * @return */ public Map<String, Long> getTermsAggByRegion(BusiPublicNoticeReqVo publicNoticeReqVo){ Map<String, Long> groupMap = new HashMap<>(); //按照省份分组 SearchResponse searchResponse = this.commonConditions(publicNoticeReqVo); Terms terms = searchResponse.getAggregations().get("agg"); for (Terms.Bucket entry : terms.getBuckets()) { groupMap.put(entry.getKey().toString(), entry.getDocCount()); } Map<String, Long> groupMap2 = new HashMap<>(); //按照父行业分组 Terms terms2 = searchResponse.getAggregations().get("aggParentindustry"); for (Terms.Bucket entry : terms2.getBuckets()) { groupMap2.put(entry.getKey().toString(), entry.getDocCount()); } Map<String, Long> groupMap3 = new HashMap<>(); //按照市场类型分组 Terms terms3 = searchResponse.getAggregations().get("aggMarketcode"); for (Terms.Bucket entry : terms3.getBuckets()) { groupMap3.put(entry.getKey().toString(), entry.getDocCount()); } return groupMap; } @Override public Map<String, Long> getTermsAggByParentIndustrycode(BusiPublicNoticeReqVo publicNoticeReqVo) { Map<String, Long> groupMap = new HashMap<>(); //按照省份分组 //客户端调用检索语法 SearchResponse searchResponse = this.commonConditions(publicNoticeReqVo); Terms terms = searchResponse.getAggregations().get("aggParentindustry"); for (Terms.Bucket entry : terms.getBuckets()) { groupMap.put(entry.getKey().toString(), entry.getDocCount()); } return groupMap; } @Override public Map<String, Long> getTermsAggByIndustrycode(BusiPublicNoticeReqVo publicNoticeReqVo) { Map<String, Long> groupMap = new HashMap<>(); //按照省份分组 //客户端调用检索语法 SearchResponse searchResponse = this.commonConditions(publicNoticeReqVo); Terms terms = searchResponse.getAggregations().get("aggIndustry"); for (Terms.Bucket entry : terms.getBuckets()) { groupMap.put(entry.getKey().toString(), entry.getDocCount()); } return groupMap; } @Override public Map<String, Long> getTermsAggByMarketcode(BusiPublicNoticeReqVo publicNoticeReqVo) { Map<String, Long> groupMap = new HashMap<>(); //按照省份分组 //客户端调用检索语法 SearchResponse searchResponse = this.commonConditions(publicNoticeReqVo); Terms terms = searchResponse.getAggregations().get("aggMarketcode"); for (Terms.Bucket entry : terms.getBuckets()) { groupMap.put(entry.getKey().toString(), entry.getDocCount()); } return groupMap; } }