EsCountService.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package cn.cslg.pas.service.business.es;
  2. import cn.cslg.pas.common.dto.PatentColumnDTO;
  3. import cn.cslg.pas.common.dto.PatentDTO;
  4. import cn.cslg.pas.common.dto.business.EsCountDTO;
  5. import cn.cslg.pas.common.dto.business.EsCountDetailDTO;
  6. import cn.cslg.pas.common.model.request.QueryRequest;
  7. import cn.cslg.pas.common.vo.EsConfigVO;
  8. import cn.cslg.pas.common.vo.business.EsCountVO;
  9. import cn.cslg.pas.common.vo.business.PatentNoVO;
  10. import cn.cslg.pas.domain.es.Patent;
  11. import cn.cslg.pas.factorys.EsBuilderFactory.IQueryBuilder;
  12. import cn.cslg.pas.factorys.EsCountBuilderFactory.EsCountBuilderFactory;
  13. import cn.cslg.pas.factorys.EsCountBuilderFactory.IEsCountBuilder;
  14. import cn.cslg.pas.service.business.CommonService;
  15. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  16. import co.elastic.clients.elasticsearch._types.aggregations.*;
  17. import co.elastic.clients.elasticsearch._types.query_dsl.HasChildQuery;
  18. import co.elastic.clients.elasticsearch._types.query_dsl.Query;
  19. import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
  20. import co.elastic.clients.elasticsearch.core.SearchRequest;
  21. import co.elastic.clients.elasticsearch.core.SearchResponse;
  22. import co.elastic.clients.elasticsearch.core.search.Hit;
  23. import co.elastic.clients.json.JsonData;
  24. import com.alibaba.fastjson.JSON;
  25. import lombok.RequiredArgsConstructor;
  26. import org.springframework.beans.BeanUtils;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.context.annotation.Lazy;
  29. import org.springframework.data.elasticsearch.client.elc.ElasticsearchAggregations;
  30. import org.springframework.stereotype.Service;
  31. import org.springframework.util.CollectionUtils;
  32. import java.io.IOException;
  33. import java.util.ArrayList;
  34. import java.util.Arrays;
  35. import java.util.Comparator;
  36. import java.util.List;
  37. import java.util.stream.Collectors;
  38. import java.util.stream.Stream;
  39. @Service
  40. @RequiredArgsConstructor(onConstructor_ = {@Lazy})
  41. public class EsCountService {
  42. private final List<String> termList = Arrays.asList();
  43. private final List<String> nestedList = Arrays.asList("PA","IN","PE");
  44. private final List<String> dateList = Arrays.asList("PD","AD");
  45. private final ElasticsearchClient client;
  46. @Autowired
  47. private EsCountBuilderFactory esCountBuilderFactory;
  48. /**
  49. * 查询专利库中的专利分组聚合统计
  50. *
  51. * @param countVOS
  52. * @return
  53. * @throws Exception
  54. */
  55. public EsCountDTO esCountSearch(List<EsCountVO> countVOS) throws Exception {
  56. EsCountDTO esCountDTO = new EsCountDTO();
  57. List<EsCountDetailDTO> detailDTOS = new ArrayList<>();
  58. for (EsCountVO vo : countVOS) {
  59. String field = vo.getField();
  60. String valueOne = vo.getValueOne();
  61. String valueTwo = vo.getValueTwo();
  62. Integer topN = vo.getTopN();
  63. SearchRequest.Builder builder = new SearchRequest.Builder();
  64. builder.index("patent_v1");
  65. IEsCountBuilder iEsCountBuilder = null;
  66. String json = CommonService.readJsonFile("esCount.json");
  67. List<EsConfigVO> esConfigVOS = JSON.parseArray(json, EsConfigVO.class);
  68. EsConfigVO esConfigVO = esConfigVOS.stream().filter(item -> item.getField().equals(field)).findFirst().orElse(null);
  69. if (esConfigVO != null) {
  70. iEsCountBuilder = esCountBuilderFactory.getClass(esConfigVO.getEsClass());
  71. iEsCountBuilder.setField(esConfigVO.getEsField());
  72. iEsCountBuilder.setValueOne(valueOne);
  73. iEsCountBuilder.setValueTwo(valueTwo);
  74. iEsCountBuilder.setTopN(topN);
  75. if (iEsCountBuilder.getField().contains(".")) {
  76. String path = iEsCountBuilder.getField().substring(0, iEsCountBuilder.getField().indexOf("."));
  77. iEsCountBuilder.setPath(path);
  78. }
  79. }
  80. Aggregation aggregation = iEsCountBuilder.createAggregation();
  81. builder.aggregations("Agg", aggregation);
  82. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  83. Aggregate agg = response.aggregations().get("Agg");
  84. List<EsCountDetailDTO> countDetailDTOS = new ArrayList<>();
  85. if (dateList.contains(field)) {
  86. List<DateHistogramBucket> list = agg.dateHistogram().buckets().array();
  87. List<EsCountDetailDTO> esCountDetailDTOS = new ArrayList<>();
  88. list.forEach(bucket -> {
  89. EsCountDetailDTO dto = new EsCountDetailDTO();
  90. dto.setField(field);
  91. Aggregate aggregate = bucket.aggregations().get("filter_agg");
  92. dto.setName(bucket.keyAsString());
  93. dto.setNumber(bucket.docCount());
  94. if (aggregate != null) {
  95. dto.setNumber(aggregate.filter().docCount());
  96. }
  97. if (dto.getNumber() > 0) {
  98. esCountDetailDTOS.add(dto);
  99. }
  100. });
  101. if (!CollectionUtils.isEmpty(esCountDetailDTOS)) {
  102. List<EsCountDetailDTO> collect = esCountDetailDTOS.stream().sorted(Comparator.comparing(EsCountDetailDTO::getName).reversed()).limit(topN).collect(Collectors.toList());
  103. detailDTOS.addAll(collect);
  104. }
  105. } else if (nestedList.contains(field)) {
  106. Aggregate termsAgg = agg.nested().aggregations().get("terms_agg");
  107. List<StringTermsBucket> list = termsAgg.sterms().buckets().array();
  108. list.forEach(bucket -> {
  109. EsCountDetailDTO dto = new EsCountDetailDTO();
  110. dto.setField(field);
  111. Aggregate aggregate = bucket.aggregations().get("filter_agg");
  112. dto.setName(bucket.key().stringValue());
  113. dto.setNumber(bucket.docCount());
  114. if (aggregate != null) {
  115. dto.setNumber(aggregate.filter().docCount());
  116. }
  117. if (dto.getNumber() > 0) {
  118. detailDTOS.add(dto);
  119. }
  120. });
  121. } else {
  122. List<StringTermsBucket> list = agg.sterms().buckets().array();
  123. list.forEach(bucket -> {
  124. EsCountDetailDTO dto = new EsCountDetailDTO();
  125. dto.setField(field);
  126. Aggregate aggregate = bucket.aggregations().get("filter_agg");
  127. dto.setName(bucket.key().stringValue());
  128. dto.setNumber(bucket.docCount());
  129. if (aggregate != null) {
  130. dto.setNumber(aggregate.filter().docCount());
  131. }
  132. if (dto.getNumber() > 0) {
  133. detailDTOS.add(dto);
  134. }
  135. });
  136. }
  137. // detailDTOS.addAll(countDetailDTOS);
  138. }
  139. esCountDTO.setDetailDTOS(detailDTOS);
  140. return esCountDTO;
  141. }
  142. /**
  143. * 根据专利号查询专利详情
  144. * @param vo
  145. * @return
  146. * @throws IOException
  147. */
  148. public PatentColumnDTO selectPatentDetail(PatentNoVO vo) throws IOException {
  149. PatentColumnDTO dto = new PatentColumnDTO();
  150. SearchRequest.Builder builder = new SearchRequest.Builder();
  151. //设置查询索引
  152. builder.index("patent");
  153. Query q = QueryBuilders.term(i -> i.field("patent_no.keyword").value(vo.getPatentNo()));
  154. Query query = QueryBuilders.bool(i -> i.must(q));
  155. builder.query(query);
  156. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  157. List<PatentColumnDTO> list = new ArrayList<>();
  158. List<Hit<Patent>> hits = response.hits().hits();
  159. for (Hit<Patent> hit : hits) {
  160. Patent esMess = hit.source();
  161. BeanUtils.copyProperties(esMess, dto);
  162. }
  163. return dto;
  164. }
  165. }