瀏覽代碼

自定义栏位查询

zero 1 年之前
父節點
當前提交
8ecb416240

+ 6 - 0
src/main/java/cn/cslg/pas/common/dto/es/EsCustomFieldValueDTO.java

@@ -1,10 +1,16 @@
 package cn.cslg.pas.common.dto.es;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
 
 import java.util.List;
 
 @Data
+@EqualsAndHashCode
+@AllArgsConstructor
+@NoArgsConstructor
 public class EsCustomFieldValueDTO {
 
     /**

+ 61 - 0
src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/CustomChildQueryBuilder.java

@@ -0,0 +1,61 @@
+package cn.cslg.pas.factorys.EsBuilderFactory;
+
+import co.elastic.clients.elasticsearch._types.query_dsl.Query;
+import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+
+@Component
+public class CustomChildQueryBuilder implements IQueryBuilder {
+    private String field = "";
+    private String value = "";
+    private String operator = "";
+    public String path = "";
+
+    @Override
+    public Query creteQuery() throws ParseException {
+        return QueryBuilders.hasChild(i -> i.type("project_customfield")
+                .query(j -> j.term(n -> n.field(field).value(value))));
+    }
+
+    @Override
+    public String getField() {
+        return field;
+    }
+
+    @Override
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    @Override
+    public String getOperator() {
+        return operator;
+    }
+
+    @Override
+    public void setOperator(String operator) {
+        this.operator = operator;
+    }
+
+    @Override
+    public String getPath() {
+        return path;
+    }
+
+    @Override
+    public void setPath(String path) {
+        this.path = path;
+    }
+}

+ 58 - 0
src/main/java/cn/cslg/pas/factorys/EsCountBuilderFactory/RangeCountBuilder.java

@@ -0,0 +1,58 @@
+package cn.cslg.pas.factorys.EsCountBuilderFactory;
+
+import co.elastic.clients.elasticsearch._types.aggregations.Aggregation;
+import org.springframework.stereotype.Component;
+
+@Component
+public class RangeCountBuilder implements IEsCountBuilder{
+    public String field = "";
+    public String valueOne = "";
+    public String valueTwo = "";
+    public Integer topN = 10;
+    public String path = "";
+
+    @Override
+    public Aggregation createAggregation() {
+        return null;
+    }
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public String getValueOne() {
+        return valueOne;
+    }
+
+    public void setValueOne(String valueOne) {
+        this.valueOne = valueOne;
+    }
+
+    public String getValueTwo() {
+        return valueTwo;
+    }
+
+    public void setValueTwo(String valueTwo) {
+        this.valueTwo = valueTwo;
+    }
+
+    public Integer getTopN() {
+        return topN;
+    }
+
+    public void setTopN(Integer topN) {
+        this.topN = topN;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+}

+ 66 - 0
src/main/java/cn/cslg/pas/service/business/es/EsService.java

@@ -8,6 +8,7 @@ import cn.cslg.pas.common.dto.PatentStarListDTO;
 import cn.cslg.pas.common.dto.business.ContentDetailDTO;
 import cn.cslg.pas.common.dto.business.EsPatentFamilyDTO;
 import cn.cslg.pas.common.dto.business.SelectClaimDTO;
+import cn.cslg.pas.common.dto.es.EsCustomFieldValueDTO;
 import cn.cslg.pas.common.model.request.MapRequest;
 import cn.cslg.pas.common.model.request.OrderDTO;
 import cn.cslg.pas.common.model.request.QueryRequest;
@@ -130,6 +131,10 @@ public class EsService {
         PatentDTO dto = new PatentDTO();
 
         String searchCondition = "";
+        List<EsCustomFieldValueDTO> customFields = queryRequest.getCustomFields();
+        if (CollectionUtils.isEmpty(customFields)) {
+            searchCondition = this.parseCustomField(customFields);
+        }
         Integer projectId = queryRequest.getProjectId();
         Long current = queryRequest.getCurrent();
         Long size = queryRequest.getSize();
@@ -222,6 +227,67 @@ public class EsService {
     }
 
     /**
+     * 解析自定义栏位和值
+     * @param customFields
+     * @return
+     */
+    public String parseCustomField(List<EsCustomFieldValueDTO> customFields) {
+        int m = 1;
+        int n = 0;
+        StringBuilder builder = new StringBuilder();
+        long start = System.currentTimeMillis();
+        if (customFields.size() > m) {
+            builder.append("(");
+            for (int i = 0; i < customFields.size(); i++) {
+                EsCustomFieldValueDTO customField = customFields.get(i);
+                if (i != n) {
+                    builder.append(" ").append("and").append(" ").append("(");
+                    this.appendStr(customField, builder, m);
+                } else {
+                    this.appendStr(customField, builder, m);
+                }
+            }
+        } else {
+            for (int i = 0; i < customFields.size(); i++) {
+                EsCustomFieldValueDTO customField = customFields.get(i);
+                int num = customFields.size() - m;
+                if (i != n) {
+                    builder.append(" ").append("and").append(" ");
+                    this.appendStr(customField, builder, m);
+                } else {
+                    this.appendStr(customField, builder, m);
+                }
+            }
+        }
+
+        long end = System.currentTimeMillis();
+        System.out.println("耗时" + (end-start));
+        return builder.toString();
+    }
+
+    public void appendStr(EsCustomFieldValueDTO customField, StringBuilder builder, int m) {
+        List<String> values = customField.getFieldValue();
+        builder.append("field").append("=").append(customField.getFieldId());
+        builder.append(" ").append("and").append(" ");
+        builder.append("fieldValue").append("=");
+        if (values.size() > m) {
+            builder.append("(");
+            for (int j = 0; j < values.size(); j++) {
+                String s = values.get(j);
+                if (j != values.size() - m) {
+                    builder.append(s).append(" ").append("or").append(" ");
+                } else {
+                    builder.append(s).append(")").append(")");
+                }
+            }
+        } else {
+            for (String value : values) {
+                builder.append(value);
+            }
+        }
+    }
+
+    /**
      * @param key
      * @param page
      * @param limit

+ 24 - 0
src/main/resources/jsons/patent.json

@@ -514,6 +514,30 @@
     "ifGroup": "false",
     "ifShow": "true",
     "ifAsCondition": "true"
+  },
+  {
+    "name": "自定义栏位id",
+    "type": "String",
+    "value": "field",
+    "field": "field",
+    "esField": "custom_field.field",
+    "esClass": "customChildQueryBuilder",
+    "ifSearch": "false",
+    "ifGroup": "false",
+    "ifShow": "true",
+    "ifAsCondition": "true"
+  },
+  {
+    "name": "自定义栏位值",
+    "type": "String",
+    "value": "fieldValue",
+    "field": "fieldValue",
+    "esField": "custom_field.field_value.raw",
+    "esClass": "customChildQueryBuilder",
+    "ifSearch": "false",
+    "ifGroup": "false",
+    "ifShow": "true",
+    "ifAsCondition": "true"
   }
 
 ]

+ 16 - 0
src/test/java/cn/cslg/pas/service/EventServiceTests.java

@@ -8,6 +8,7 @@ import cn.cslg.pas.common.dto.business.EsPatentFamilyDTO;
 import cn.cslg.pas.common.dto.business.ReportTempleDTO;
 import cn.cslg.pas.common.dto.business.SelectClaimDTO;
 import cn.cslg.pas.common.dto.es.EsCustomFieldDTO;
+import cn.cslg.pas.common.dto.es.EsCustomFieldValueDTO;
 import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.model.request.*;
 import cn.cslg.pas.common.utils.Response;
@@ -294,4 +295,19 @@ public class EventServiceTests {
         dto.setPatentNo("CN201910069334.7");
         esCustomFieldService.addCustomField(dto);
     }
+
+    @Test
+    void test16() {
+        List<EsCustomFieldValueDTO> customFields = new ArrayList<>();
+        EsCustomFieldValueDTO dto1 = new EsCustomFieldValueDTO();
+        dto1.setFieldId("1");
+        dto1.setFieldValue(Arrays.asList("a", "b"));
+        EsCustomFieldValueDTO dto2 = new EsCustomFieldValueDTO();
+        dto2.setFieldId("2");
+        dto2.setFieldValue(Arrays.asList("a", "b"));
+        customFields.add(dto1);
+        customFields.add(dto2);
+        String s = esService.parseCustomField(customFields);
+        System.out.println("结果为:" + s);
+    }
 }