chenyi 1 年之前
父节点
当前提交
fa7a5ed038

+ 13 - 0
src/main/java/cn/cslg/pas/common/vo/EsConfigVO.java

@@ -0,0 +1,13 @@
+package cn.cslg.pas.common.vo;
+
+import lombok.Data;
+
+@Data
+public class EsConfigVO {
+    private String name;
+    private String type;
+    private String value;
+    private String field;
+    private String esField;
+    private String esClass;
+}

+ 62 - 0
src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/ChildQueryBuilder.java

@@ -0,0 +1,62 @@
+package cn.cslg.pas.factorys.EsBuilderFactory;
+
+import co.elastic.clients.elasticsearch._types.query_dsl.MatchQuery;
+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 ChildQueryBuilder implements IQueryBuilder {
+    private String field = "";
+    private String value = "";
+    private String operator = "";
+    public String path = "";
+
+    @Override
+    public Query creteQuery() throws ParseException {
+        return QueryBuilders.hasChild(child -> child.type("project")
+                .query(org.springframework.data.elasticsearch.client.elc.QueryBuilders.matchQueryAsQuery(field, value, null, null)));
+    }
+
+    @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;
+    }
+}

+ 95 - 0
src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/DateQueryBuilder.java

@@ -0,0 +1,95 @@
+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;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+@Component
+public class DateQueryBuilder implements IQueryBuilder {
+    private String field = "";
+    private String value = "";
+    private String operator = "";
+    public String path = "";
+    public static final int YEAR = 4;
+    public static final int MONTH = 7;
+    public static final int DAY = 10;
+
+
+    @Override
+    public Query creteQuery() throws ParseException {
+        Query query = null;
+        if (value != null && !"".equals(value)) {
+            Calendar calendar = Calendar.getInstance();
+            if (value.length() == YEAR) {
+                SimpleDateFormat format = new SimpleDateFormat("yyyy");
+                Date year = format.parse(value);
+                calendar.setTime(year);
+                String yearTime = String.valueOf(calendar.getTime().getTime());
+                calendar.add(Calendar.YEAR, 1);
+                String yearNextTime = String.valueOf(calendar.getTime().getTime());
+                query = co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders
+                        .range(range -> range.field(field).from(yearTime.substring(0,10)).to(yearNextTime.substring(0,10)));
+            } else if (value.length() == MONTH) {
+                SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM");
+                Date month = format1.parse(value);
+                calendar.setTime(month);
+                String monthTime = String.valueOf(calendar.getTime().getTime());
+                calendar.add(Calendar.MONTH, 1);
+                String monthNextTime = String.valueOf(calendar.getTime().getTime());
+                query = co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders
+                        .range(range -> range.field(field).from(monthTime.substring(0,10)).to(monthNextTime.substring(0,10)));
+            } else if (value.length() == DAY) {
+                SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd");
+                Date day = format2.parse(value);
+                String dayTime = String.valueOf(day.getTime());
+                query = QueryBuilders.match(dayQuery -> dayQuery.field(field).query(dayTime.substring(0,10)));
+            }
+        }
+        return query;
+    }
+
+    @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;
+    }
+}

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

@@ -0,0 +1,20 @@
+package cn.cslg.pas.factorys.EsBuilderFactory;
+
+import cn.cslg.pas.factorys.businessFactory.Business;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Component
+public class EsBuilderFactory {
+    @Autowired
+    private Map<String, IQueryBuilder> iQueryBuilderMap;
+
+
+    public IQueryBuilder getClass(String builderName) {
+        IQueryBuilder bean1 = iQueryBuilderMap.get(builderName);
+
+        return bean1;
+    }
+}

+ 32 - 0
src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/IQueryBuilder.java

@@ -0,0 +1,32 @@
+package cn.cslg.pas.factorys.EsBuilderFactory;
+
+import cn.cslg.pas.common.model.cronModel.SqlObject;
+import co.elastic.clients.elasticsearch._types.query_dsl.Query;
+
+import java.text.ParseException;
+
+public interface IQueryBuilder {
+    public String field = "";
+    public String value = "";
+    public String operator = "";
+    public String path = "";
+
+    Query creteQuery() throws ParseException;
+
+    public String getField();
+
+    public void setField(String field);
+
+    public String getValue();
+
+    public void setValue(String value);
+
+    public String getOperator();
+
+    public void setOperator(String operator);
+
+    public String getPath();
+
+    public void setPath(String path);
+
+}

+ 51 - 0
src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/KeyWordQueryBuilder.java

@@ -0,0 +1,51 @@
+package cn.cslg.pas.factorys.EsBuilderFactory;
+
+
+import co.elastic.clients.elasticsearch._types.query_dsl.Query;
+import org.springframework.data.elasticsearch.client.elc.QueryBuilders;
+import org.springframework.stereotype.Component;
+
+@Component
+public class KeyWordQueryBuilder implements IQueryBuilder {
+    private String field = "";
+    private String value = "";
+    private String operator = "";
+    public String path = "";
+
+    @Override
+    public Query creteQuery() {
+        return QueryBuilders.matchQueryAsQuery(field, value, null, null);
+    }
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getOperator() {
+        return operator;
+    }
+
+    public void setOperator(String operator) {
+        this.operator = operator;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+}

+ 58 - 0
src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/NestedQueryBuilder.java

@@ -0,0 +1,58 @@
+package cn.cslg.pas.factorys.EsBuilderFactory;
+
+import co.elastic.clients.elasticsearch._types.query_dsl.Query;
+import org.springframework.data.elasticsearch.client.elc.QueryBuilders;
+import org.springframework.stereotype.Component;
+
+@Component
+public class NestedQueryBuilder implements IQueryBuilder {
+    private String field = "";
+    private String value = "";
+    private String operator = "";
+    public String path = "";
+
+    @Override
+    public Query creteQuery() {
+        Query query = QueryBuilders.matchQueryAsQuery(field, value, null, null);
+        Query nestedQuery = co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders.nested(z -> z.path(path).query(query));
+        return nestedQuery;
+    }
+
+    @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;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+}

+ 77 - 0
src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/NumberQueryBuilder.java

@@ -0,0 +1,77 @@
+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 co.elastic.clients.json.JsonData;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+
+@Component
+public class NumberQueryBuilder implements IQueryBuilder{
+    private String field = "";
+    private String value = "";
+    private String operator = "";
+    public String path = "";
+    public static final String GT = ">";
+    public static final String GTE = ">=";
+    public static final String LT = "<";
+    public static final String LTE = "<=";
+
+    @Override
+    public Query creteQuery() throws ParseException {
+        Query query = null;
+        if (operator.equals(GT)) {
+            query = QueryBuilders.range(range -> range.field(field).gt(JsonData.of(value)));
+        } else if (operator.equals(GTE)) {
+            query = QueryBuilders.range(range -> range.field(field).gte(JsonData.of(value)));
+        } else if (operator.equals(LT)) {
+            query = QueryBuilders.range(range -> range.field(field).lt(JsonData.of(value)));
+        } else if (operator.equals(LTE)) {
+            query = QueryBuilders.range(range -> range.field(field).lte(JsonData.of(value)));
+        } else {
+            query = QueryBuilders.match(q -> q.field(field).query(value));
+        }
+        return query;
+    }
+
+    @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;
+    }
+}

+ 54 - 9
src/main/java/cn/cslg/pas/service/business/es/EsService.java

@@ -1,16 +1,18 @@
 package cn.cslg.pas.service.business.es;
 
+import cn.cslg.pas.common.utils.parseQueryToTree.expressManager;
+import cn.cslg.pas.common.utils.parseQueryToTree.operateNode;
+import cn.cslg.pas.common.utils.parseQueryToTree.treeNode;
 import cn.cslg.pas.common.vo.PatentWithIdVO;
 import cn.cslg.pas.domain.es.Patent;
-import cn.cslg.pas.service.query.Query;
+import cn.cslg.pas.service.query.FormatQueryService;
 import co.elastic.clients.elasticsearch.ElasticsearchClient;
 import co.elastic.clients.elasticsearch._types.SortOrder;
-import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery;
-import co.elastic.clients.elasticsearch._types.query_dsl.HasChildQuery;
-import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
+import co.elastic.clients.elasticsearch._types.query_dsl.*;
 import co.elastic.clients.elasticsearch.core.*;
 import co.elastic.clients.elasticsearch.core.search.Hit;
 import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
@@ -22,8 +24,12 @@ import java.util.List;
 @Service
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class EsService {
+
     private final ElasticsearchClient client;
 
+    @Autowired
+    private FormatQueryService formatQueryService;
+
     /**
      * @param patent
      * @throws Exception
@@ -86,6 +92,46 @@ public class EsService {
     }
 
     /**
+     * @param searchCondition 检索条件
+     * @param page            检索页码
+     * @param size            页大小
+     * @param orderFields     排序字段
+     * @return
+     */
+    public List<Patent> Search(String searchCondition, Integer page, Integer size, List<String> orderFields) throws Exception {
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        //设置查询索引
+        builder.index("patent");
+
+
+        //1. 解析检索条件
+        treeNode tree = expressManager.getInstance().Parse(searchCondition, false);
+        //格式化检索式
+        //3. 从es中检索数据
+        Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "esConfig");
+        //4. 返回数据
+        //分页
+        if (page != null && size != null) {
+            builder.from(page).size(size);
+        }
+        builder.query(q);
+        //排序
+        builder.sort(sortOptionsBuilder -> sortOptionsBuilder
+                .field(fieldSortBuilder -> fieldSortBuilder
+                        .field("public_date").order(SortOrder.Desc)));
+
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+        List<Patent> list = new ArrayList<>();
+        List<Hit<Patent>> hits = response.hits().hits();
+        for (Hit<Patent> hit : hits) {
+            Patent esMess = hit.source();
+            list.add(esMess);
+        }
+
+        return list;
+    }
+
+    /**
      * @param key
      * @param page
      * @param limit
@@ -98,15 +144,14 @@ public class EsService {
         builder.index("patent");
         //组装查询条件
         BoolQuery.Builder boolQuery = new BoolQuery.Builder();
-
-        boolQuery.should(q -> q.matchPhrasePrefix(m -> m
-                .query(key)
+        boolQuery.should(q -> q.match(v -> v
+               .query(key)
                 //字段名
-                .field("title")
+                .field("patent_no")
         ));
 
         //多字段匹配
-        boolQuery.should(q -> q.matchPhrasePrefix(m -> m.query(key).field("content")));
+//        boolQuery.should(q -> q.matchPhrasePrefix(m -> m.query(key).field("content")));
 
         builder.query(q -> q.bool(boolQuery.build()));
         //分页

+ 42 - 0
src/main/java/cn/cslg/pas/service/query/FormatQueryService.java

@@ -9,12 +9,16 @@ import cn.cslg.pas.common.model.request.QueryRequest;
 import cn.cslg.pas.common.model.request.StringRequest;
 import cn.cslg.pas.common.utils.StringUtils;
 import cn.cslg.pas.common.utils.parseQueryToTree.*;
+import cn.cslg.pas.common.vo.EsConfigVO;
 import cn.cslg.pas.exception.ConditionException;
+import cn.cslg.pas.factorys.EsBuilderFactory.EsBuilderFactory;
+import cn.cslg.pas.factorys.EsBuilderFactory.IQueryBuilder;
 import cn.cslg.pas.factorys.getOrderFactory.GetOrderFactory;
 import cn.cslg.pas.factorys.getOrderFactory.GetOrderObject;
 import cn.cslg.pas.factorys.getSqlFactorys.GetSqlFactory;
 import cn.cslg.pas.factorys.getSqlFactorys.GetSqlObject;
 import cn.cslg.pas.service.business.CommonService;
+import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
 import com.alibaba.fastjson.JSON;
 import com.google.gson.Gson;
 import lombok.RequiredArgsConstructor;
@@ -22,8 +26,10 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
+import co.elastic.clients.elasticsearch._types.query_dsl.Query;
 
 import java.io.*;
+import java.text.ParseException;
 import java.util.*;
 
 /**
@@ -39,6 +45,10 @@ public class FormatQueryService {
     @Autowired
     private GetOrderFactory getOrderFactory;
 
+    @Autowired
+    private EsBuilderFactory esBuilderFactory;
+
+
     public String getText(String text) throws Exception {
         treeNode tree = expressManager.getInstance().Parse(text, false);
         System.out.print(this.ToString((operateNode) tree));
@@ -370,4 +380,36 @@ public class FormatQueryService {
 
         return reQuery;
     }
+
+    public Query EsQueryToQuery(operateNode node, String configName) throws ParseException {
+        Query query = null;
+        operate operate1 = node.getoperate();
+        treeNode Left = node.getLeft();
+        treeNode Right = node.getRight();
+        if (operate1.getShowName().equals(enuType.Logic)) {
+            Query q1 = this.EsQueryToQuery((operateNode) Left, configName);
+            Query q2 = this.EsQueryToQuery((operateNode) Right, configName);
+            query = QueryBuilders.bool(i -> i.must(q1, q2));
+        } else if (operate1.getShowName().equals(enuType.Assignment)){
+            IQueryBuilder iQueryBuilder = null;
+            String field = Left.ToString();
+            String value = Right.ToString();
+            String json = CommonService.readJsonFile(configName + ".json");
+            List<EsConfigVO> esConfigVOS = JSON.parseArray(json, EsConfigVO.class);
+            EsConfigVO esConfigVO = esConfigVOS.stream().filter(item -> item.getValue().equals(field)).findFirst().orElse(null);
+            if (esConfigVO != null) {
+                iQueryBuilder = esBuilderFactory.getClass(esConfigVO.getEsClass());
+                iQueryBuilder.setField(esConfigVO.getEsField());
+                if (iQueryBuilder.getField().contains(".")) {
+                    String path = iQueryBuilder.getField().substring(0, iQueryBuilder.getField().indexOf("."));
+                    iQueryBuilder.setPath(path);
+                }
+                iQueryBuilder.setOperator(operate1.getShowName());
+                iQueryBuilder.setValue(value);
+                query = iQueryBuilder.creteQuery();
+            }
+        }
+
+        return query;
+    }
 }

+ 58 - 0
src/main/resources/jsons/esConfig.json

@@ -0,0 +1,58 @@
+[
+  {
+    "name": "专利号",
+    "type": "String",
+    "value": "patentNo",
+    "field": "patentNo",
+    "esField": "patent_no",
+    "esClass": "keyWordQueryBuilder"
+  },
+  {
+    "name": "标题",
+    "type": "String",
+    "value": "titleTextContent",
+    "field": "titleTextContent",
+    "esField": "title.text_content",
+    "esClass": "nestedQueryBuilder"
+  },
+  {
+    "name": "公开日期",
+    "type": "String",
+    "value": "publicDate",
+    "field": "publicDate",
+    "esField": "public_date",
+    "esClass": "dateQueryBuilder"
+  },
+  {
+    "name": "申请日期",
+    "type": "String",
+    "value": "appDate",
+    "field": "appDate",
+    "esField": "app_date",
+    "esClass": "dateQueryBuilder"
+  },
+  {
+    "name": "授权日期",
+    "type": "String",
+    "value": "grantDate",
+    "field": "grantDate",
+    "esField": "grant_date",
+    "esClass": "dateQueryBuilder"
+  },
+  {
+    "name": "家族号",
+    "type": "String",
+    "value": "simpleFamilyNum",
+    "field": "simpleFamilyNum",
+    "esField": "simple_family_num",
+    "esClass": "numberQueryBuilder"
+  },
+  {
+    "name": "子文档号",
+    "type": "String",
+    "value": "projectId",
+    "field": "projectId",
+    "esField": "project_id",
+    "esClass": "childQueryBuilder"
+  }
+]

+ 16 - 1
src/test/java/cn/cslg/pas/service/EsServiceTests.java

@@ -8,12 +8,13 @@ import cn.cslg.pas.service.business.es.EsService;
 
 import cn.cslg.pas.service.importPatent.SchedulingTaskService;
 import cn.hutool.core.util.XmlUtil;
-import org.junit.jupiter.api.Test;
+import org.junit.Test;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
 import javax.swing.text.Document;
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -22,6 +23,7 @@ import java.util.List;
  */
 @SpringBootTest
 public class EsServiceTests {
+
     @Autowired
     private EsService esService;
 
@@ -61,4 +63,17 @@ public class EsServiceTests {
         System.out.println(patentList);
         Thread.sleep(1000000);
     }
+
+    @Test
+    void search() throws Exception {
+        List<Patent> list = esService.Search("patentNo=CN201199922Y and simpleFamilyNum>1 or simpleFamilyNum=0", 0, 50,null);
+//        List<Patent> list = esService.Search("titleTextContent=电子 or projectId=1", 0, 50,null);
+//        List<Patent> list = esService.Search("patentNo=CN201199922Y and simpleFamilyNum>1", 0, 50,null);
+//        List<Patent> list = esService.Search("publicDate=2009-03", 0, 50,null);
+//        List<Patent> list = esService.Search("simpleFamilyNum>1", 0, 50,null);
+//        List<Patent> list = esService.Search("titleTextContent=电子", 0, 50,null);
+//        List<Patent> list = esService.Search("projectId=1", 0, 50,null);
+//        List<Patent> list = esService.search("patentNo=CN201199922Y", 0, 50);
+        System.out.println(list);
+    }
 }