Browse Source

es聚合统计

zero 1 year ago
parent
commit
c2b0c64593

+ 12 - 5
src/main/java/cn/cslg/pas/factorys/EsCountBuilderFactory/DateHistogramBuilder.java

@@ -1,13 +1,15 @@
 package cn.cslg.pas.factorys.EsCountBuilderFactory;
 
-import co.elastic.clients.elasticsearch._types.aggregations.Aggregation;
-import co.elastic.clients.elasticsearch._types.aggregations.AggregationBuilders;
-import co.elastic.clients.elasticsearch._types.aggregations.CalendarInterval;
+import co.elastic.clients.elasticsearch._types.SortOrder;
+import co.elastic.clients.elasticsearch._types.aggregations.*;
 import co.elastic.clients.elasticsearch._types.query_dsl.Query;
 import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
+import co.elastic.clients.util.NamedValue;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
+import java.util.HashMap;
+
 @Component
 public class DateHistogramBuilder implements IEsCountBuilder{
     public String field = "";
@@ -19,10 +21,15 @@ public class DateHistogramBuilder implements IEsCountBuilder{
     @Override
     public Aggregation createAggregation() {
         Aggregation aggregation = AggregationBuilders.dateHistogram(i -> i.field(field).format("yyyy").calendarInterval(CalendarInterval.Year));
-        if (StringUtils.isNotEmpty(valueTwo)) {
+        if (StringUtils.isNotEmpty(valueOne) && StringUtils.isNotEmpty(valueTwo)) {
             Query query = QueryBuilders.range(j -> j.field(field).from(valueOne).to(valueTwo));
             Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
-            aggregation.aggregations().put("filter_agg",filter);
+            aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
+                    .field(field).format("yyyy")
+                    .calendarInterval(CalendarInterval.Year).build())
+                    .aggregations(new HashMap() {{
+                        put("filter_agg", filter);
+                    }}).build();
         }
         return aggregation;
     }

+ 1 - 1
src/main/java/cn/cslg/pas/factorys/EsCountBuilderFactory/TermsCountBuilder.java

@@ -21,7 +21,7 @@ public class TermsCountBuilder implements IEsCountBuilder{
 
     @Override
     public Aggregation createAggregation() {
-        Aggregation aggregation = AggregationBuilders.terms(i -> i.field(field).size(topN)).terms()._toAggregation();
+        Aggregation aggregation = AggregationBuilders.terms(i -> i.field(field).size(topN));
         if (StringUtils.isNotEmpty(valueOne)) {
             Aggregation filter = AggregationBuilders.filter(n -> n.term(m -> m.field(field).value(valueOne)));
             aggregation = new Aggregation.Builder().terms(new TermsAggregation.Builder()

+ 16 - 2
src/main/java/cn/cslg/pas/service/business/es/EsCountService.java

@@ -25,11 +25,15 @@ import org.springframework.data.elasticsearch.client.elc.ElasticsearchAggregatio
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 @Service
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class EsCountService {
+    private final List<String> termList = Arrays.asList();
+    private final List<String> nestedList = Arrays.asList();
+    private final List<String> dateList = Arrays.asList();
 
     private final ElasticsearchClient client;
 
@@ -71,13 +75,23 @@ public class EsCountService {
         builder.aggregations("Agg", aggregation);
         SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
         Aggregate agg = response.aggregations().get("Agg");
-        List<StringTermsBucket> list = agg.sterms().buckets().array();
+//        List<DateHistogramBucket> array = agg.autoDateHistogram().buckets().array();
+//        agg.nested().aggregations().get("terms_agg");
+
         List<EsCountDetailDTO> detailDTOS = new ArrayList<>();
+        List<StringTermsBucket> list = agg.sterms().buckets().array();
         list.forEach(bucket -> {
             EsCountDetailDTO dto = new EsCountDetailDTO();
+            Aggregate aggregate = bucket.aggregations().get("filter_agg");
             dto.setName(bucket.key().stringValue());
             dto.setNumber(bucket.docCount());
-            detailDTOS.add(dto);
+            if (aggregate != null) {
+                dto.setNumber(aggregate.filter().docCount());
+                dto.setName(bucket.key().stringValue());
+            }
+            if (dto.getNumber() > 0) {
+                detailDTOS.add(dto);
+            }
         });
         esCountDTO.setDetailDTOS(detailDTOS);
         return esCountDTO;

+ 2 - 2
src/main/resources/jsons/esCount.json

@@ -281,7 +281,7 @@
     "value": "PD",
     "field": "PD",
     "esField": "public_date",
-    "esClass": "dateQueryBuilder",
+    "esClass": "dateHistogramBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
     "ifShow": "true",
@@ -293,7 +293,7 @@
     "value": "AD",
     "field": "AD",
     "esField": "app_date",
-    "esClass": "dateQueryBuilder",
+    "esClass": "dateHistogramBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
     "ifShow": "true",

+ 7 - 48
src/test/java/cn/cslg/pas/service/EventServiceTests.java

@@ -210,59 +210,18 @@ public class EventServiceTests {
 
     @Test
     void test5() throws IOException {
-//        SelectClaimDTO dto = esService.selectClaim("CN102324864A");
-//        System.out.println(dto);
-
-        Aggregation range = AggregationBuilders.range(n -> n.field("app_date").format("yyyy"));
-        Aggregation aggregation = AggregationBuilders.dateHistogram(i -> i.field("app_date").format("yyyy").calendarInterval(CalendarInterval.Year));
-        Query query = QueryBuilders.range(j -> j.field("app_date").from("2021").to("2023"));
-        Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
-        aggregation.aggregations().put("filter_agg",filter);
-
-        System.out.println(aggregation);
-
-    }
-
-    @Test
-    void test6() {
-        String valueOne = "H02";
-        Aggregation aggregation = AggregationBuilders.terms(i -> i.field("mipc.level2").size(10));
-        if (StringUtils.isNotEmpty(valueOne)) {
-            Query query = QueryBuilders.term(j -> j.field("mipc.level2").value(valueOne));
-            Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
-            Map<String, Aggregation> map = aggregation.aggregations();
-            System.out.println(map + "----------------");
-            map.put("filter_agg", filter);
-            System.out.println(map);
-        }
-        System.out.println(aggregation);
+        SelectClaimDTO dto = esService.selectClaim("CN102324864A");
+        System.out.println(dto);
     }
-
-    @Test
-    void test7() {
-        String valueOne = "";
-        Aggregation terms = AggregationBuilders.terms(j -> j.field("applicant.name.key").size(10));
-        if (StringUtils.isNotEmpty(valueOne)) {
-            Query query = QueryBuilders.term(j -> j.field("applicant.name.key").value(valueOne));
-            Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
-            terms.aggregations().put("filter_agg",filter);
-        }
-        Aggregation aggregation = AggregationBuilders.nested(i -> i.path("applicant")).aggregations().put("terms_agg", terms);
-        System.out.println(aggregation);
-    }
-
     @Test
     void test8() throws Exception {
-//        String valueOne = "";
-//        String str = "*";
-//        String s = str.concat(valueOne).concat("*");
-//        Query query = QueryBuilders.wildcard(i -> i.field("").value(s));
-//        Aggregation aggregation = AggregationBuilders.filter(i -> i.bool(j -> j.must(query)));
-//        System.out.println(aggregation);
         EsCountVO vo = new EsCountVO();
-        vo.setField("PT");
-        vo.setValueOne("1");
 //        vo.setField("PA");
+//        vo.setField("CO");
+        vo.setField("PT");
+//        vo.setValueOne("1");
+//        vo.setValueTwo("1");
+//        vo.setField("AD");
         EsCountDTO esCountDTO = esCountService.esCountSearch(vo);
         System.out.println(esCountDTO);