许家凯 пре 2 година
родитељ
комит
48e94e5fad

+ 13 - 1
src/main/java/com/winhc/phoenix/example/dao/SearchDao.java

@@ -2,6 +2,7 @@ package com.winhc.phoenix.example.dao;
 
 import lombok.SneakyThrows;
 import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.search.aggregations.AggregationBuilder;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
 import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
 import org.elasticsearch.search.rescore.QueryRescorerBuilder;
@@ -21,7 +22,18 @@ public interface SearchDao {
 
     Object search(String index, String type, QueryBuilder query, List<QueryRescorerBuilder> rescoreBuilder, SortBuilder sortBuilder, FetchSourceContext fetchSourceContext, int from, int size, String preference);
 
-    Object search(String index, String type, QueryBuilder query, List<QueryRescorerBuilder> rescoreBuilder, List<SortBuilder> sortBuilder, FetchSourceContext fetchSourceContext, int from, int size, String preference,List<String> highlightField);
+    Object search(String index
+            , String type
+            , QueryBuilder query
+            , List<QueryRescorerBuilder> rescoreBuilder
+            , List<SortBuilder> sortBuilder
+            , FetchSourceContext fetchSourceContext
+            , int from
+            , int size
+            , String preference
+            ,List<String> highlightField
+            ,List<AggregationBuilder> aggList
+    );
 
     @SneakyThrows
     Object search(String index, String type, SearchSourceBuilder searchSourceBuilder);

+ 9 - 1
src/main/java/com/winhc/phoenix/example/dao/impl/SearchDaoImpl.java

@@ -17,6 +17,7 @@ import org.elasticsearch.client.Response;
 import org.elasticsearch.client.RestClient;
 import org.elasticsearch.client.RestHighLevelClient;
 import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.search.aggregations.AggregationBuilder;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
 import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
 import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
@@ -113,7 +114,7 @@ public class SearchDaoImpl implements SearchDao {
         if (sortBuilder != null) {
             objects.add(sortBuilder);
         }
-        return search(index, type, query, rescoreBuilder, objects, fetchSourceContext, from, size, preference, list);
+        return search(index, type, query, rescoreBuilder, objects, fetchSourceContext, from, size, preference, list,null);
     }
 
     @SneakyThrows
@@ -128,6 +129,7 @@ public class SearchDaoImpl implements SearchDao {
             , int size
             , String preference
             , List<String> highlightField
+            , List<AggregationBuilder> aggList
     ) {
 
         HighlightBuilder highlightBuilder = new HighlightBuilder().order(HighlightBuilder.Order.SCORE)
@@ -144,6 +146,12 @@ public class SearchDaoImpl implements SearchDao {
                 .size(size)
                 .highlighter(highlightBuilder);
 
+        if (aggList != null && !aggList.isEmpty()) {
+            for (AggregationBuilder aggregationBuilder : aggList) {
+                searchSourceBuilder.aggregation(aggregationBuilder);
+            }
+        }
+
         if (rescoreBuilder != null && !rescoreBuilder.isEmpty()) {
             for (RescoreBuilder builder : rescoreBuilder) {
                 searchSourceBuilder.addRescorer(builder);

+ 38 - 4
src/main/java/com/winhc/phoenix/example/service/impl/JudgmentDocumentsServiceImpl.java

@@ -6,6 +6,7 @@ import com.winhc.phoenix.example.util.company.search.CompanyIndexUtils;
 import com.winhc.phoenix.example.vo.judgment.JudgmentDocumentsSearchContent;
 import com.winhc.phoenix.example.vo.judgment.JudgmentDocumentsSearchType;
 import com.winhc.phoenix.example.vo.judgment.JudgmentDocumentsSortType;
+import com.winhc.phoenix.example.vo.judgment.QueryOrAgg;
 import com.winhc.tool.bean.IpInfo;
 import com.winhc.tool.component.WinhcIpParser;
 import lombok.AllArgsConstructor;
@@ -14,6 +15,9 @@ import org.apache.commons.lang3.StringUtils;
 import org.elasticsearch.index.query.BoolQueryBuilder;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.script.Script;
+import org.elasticsearch.search.aggregations.AggregationBuilder;
+import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
+import org.elasticsearch.search.aggregations.support.ValueType;
 import org.elasticsearch.search.sort.*;
 import org.springframework.stereotype.Service;
 
@@ -31,9 +35,9 @@ import static org.elasticsearch.index.query.QueryBuilders.*;
 @Service
 @AllArgsConstructor
 public class JudgmentDocumentsServiceImpl implements JudgmentDocumentsService {
-    private WinhcIpParser winhcIpParser;
+    private final WinhcIpParser winhcIpParser;
 
-    private SearchDao searchDao;
+    private final SearchDao searchDao;
     public static final String index = "wenshu_detail4";
     public static final String type = "wenshu_detail_type";
 
@@ -100,7 +104,7 @@ public class JudgmentDocumentsServiceImpl implements JudgmentDocumentsService {
         List<SortBuilder> sortBuilders = new ArrayList<>();
         if (sort == null && !searchContent.isNotSort()) {
             String ip = searchContent.getIp();
-            if(StringUtils.isNotBlank(ip)){
+            if (StringUtils.isNotBlank(ip)) {
                 IpInfo ipInfo = winhcIpParser.parseIp(ip);
                 if (ipInfo.getIpProvinceCode() != null) {
                     Map<String, Object> map = new HashMap<String, Object>(2);
@@ -120,12 +124,42 @@ public class JudgmentDocumentsServiceImpl implements JudgmentDocumentsService {
                 sortBuilders.add(order);
             }
         }
+        List<AggregationBuilder> aggList = null;
+        if (QueryOrAgg.AGG.equals(searchContent.getQueryOrAgg())) {
+            aggList = agg();
+            from = 0;
+            size = 0;
+        } else if (QueryOrAgg.QUERY_AND_AGG.equals(searchContent.getQueryOrAgg())) {
+            aggList = agg();
+        }
+
 
-        Object search = searchDao.search(index, type, boolQuery, null, sortBuilders, null, from, size, preference, highlightField);
+        Object search = searchDao.search(index
+                , type
+                , boolQuery
+                , null
+                , sortBuilders
+                , null
+                , from
+                , size
+                , preference
+                , highlightField
+                , aggList
+        );
         return search;
     }
 
 
+    public List<AggregationBuilder> agg() {
+        ArrayList<AggregationBuilder> agg = new ArrayList<>();
+
+        agg.add(new TermsAggregationBuilder("court_level_agg", ValueType.STRING).field("court_level"));
+
+
+        return agg;
+    }
+
+
     private static QueryBuilder getSearchContentQuery(JudgmentDocumentsSearchType searchScope, String content) {
         BoolQueryBuilder boolQuery = boolQuery();
         List<String> fields = searchScope.getFields();

+ 3 - 0
src/main/java/com/winhc/phoenix/example/vo/judgment/JudgmentDocumentsSearchContent.java

@@ -110,4 +110,7 @@ public class JudgmentDocumentsSearchContent {
         return sort != null && sort == JudgmentDocumentsSortType.NOT_SORT;
     }
 
+    private QueryOrAgg queryOrAgg = QueryOrAgg.QUERY_AND_AGG;
+
+
 }

+ 9 - 0
src/main/java/com/winhc/phoenix/example/vo/judgment/QueryOrAgg.java

@@ -0,0 +1,9 @@
+package com.winhc.phoenix.example.vo.judgment;
+
+/**
+ * @author: XuJiakai
+ * 2022/8/18 15:02
+ */
+public enum QueryOrAgg {
+    QUERY, AGG, QUERY_AND_AGG
+}