Kaynağa Gözat

20241119 外部检索专利时返回专利相似度信息

lwhhszx 10 ay önce
ebeveyn
işleme
5a47eff6d8

+ 8 - 0
src/main/java/cn/cslg/pas/common/model/es/GetVectorVO.java

@@ -0,0 +1,8 @@
+package cn.cslg.pas.common.model.es;
+
+import lombok.Data;
+
+@Data
+public class GetVectorVO {
+    private String text;
+}

+ 8 - 0
src/main/java/cn/cslg/pas/controller/outApi/OutSidersController.java

@@ -8,6 +8,7 @@ import cn.cslg.pas.domain.business.TaskCode;
 import cn.cslg.pas.service.business.ProjectTaskService;
 import cn.cslg.pas.service.business.ReportProjectService;
 import cn.cslg.pas.service.business.TaskCodeService;
+import cn.cslg.pas.service.business.es.EsPatentVectorService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -33,6 +34,7 @@ public class OutSidersController {
     private final TaskCodeService taskCodeService;
     private final ProjectTaskService projectTaskService;
     private final ReportProjectService reportService;
+    private final EsPatentVectorService esPatentVectorService;
     @RequestMapping(value = "/getTaskByCode", method = RequestMethod.GET)
     @Operation(summary = "根据code码获得任务信息")
     public Response getTaskByCode(String code) throws IOException {
@@ -53,4 +55,10 @@ public class OutSidersController {
         return Response.error("code码输入错误");
     }
 
+    @RequestMapping(value = "/refreashPatentVector", method = RequestMethod.GET)
+    public void refreashPatentVector(Integer id){
+
+
+
+    }
 }

+ 2 - 1
src/main/java/cn/cslg/pas/domain/es/Patent.java

@@ -434,5 +434,6 @@ public class Patent {
     @JsonProperty("main_right_num")
     private Integer mainRightNum;
 
-
+    @JsonProperty("abstract_vector")
+    private List<Float> abstractVector;
 }

+ 87 - 0
src/main/java/cn/cslg/pas/service/business/es/EsPatentVectorService.java

@@ -0,0 +1,87 @@
+package cn.cslg.pas.service.business.es;
+
+import cn.cslg.pas.common.model.es.GetVectorVO;
+import cn.cslg.pas.domain.es.Patent;
+import cn.cslg.pas.domain.es.PatentJoin;
+import cn.cslg.pas.domain.es.Text;
+import cn.cslg.pas.service.common.PythonApiService;
+import co.elastic.clients.elasticsearch.ElasticsearchClient;
+import co.elastic.clients.elasticsearch._types.query_dsl.Query;
+import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
+import co.elastic.clients.elasticsearch.core.SearchRequest;
+import co.elastic.clients.elasticsearch.core.SearchResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
+public class EsPatentVectorService {
+
+    private final ElasticsearchClient client;
+    private final PythonApiService pythonApiService;
+    private final EsService esService;
+
+    public void addPatentVector(Patent patent, String id) throws Exception {
+        Boolean ifHaveVector = this.searchIfHaveVector(id);
+        if (!ifHaveVector) {
+            this.addPatentVectorToEs(patent, id);
+        }
+    }
+
+    public Boolean searchIfHaveVector(String parentId) throws IOException {
+        boolean flag = false;
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        //设置查询索引
+        builder.index("patent");
+
+        Query q2 = QueryBuilders.parentId(parent -> parent.type("patent_vector").id(parentId));
+        Query bool = QueryBuilders.bool(i -> i.must(q2));
+        builder.query(bool);
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+        long total = response.hits().total().value();
+        if (total > 0) {
+            flag = true;
+        }
+        return flag;
+    }
+
+
+    public void addPatentVectorToEs(Patent patent, String patentId) throws Exception {
+
+        if (patent.getAbstractStr() != null && patent.getAbstractStr().size() > 0) {
+            Text text = patent.getAbstractStr().stream().filter(item -> item.getIfOrigin().equals(true)).findFirst().orElse(null);
+            if (text != null) {
+                String abStr = text.getTextContent();
+                GetVectorVO getVectorVO = new GetVectorVO();
+                getVectorVO.setText(abStr);
+                List<Float> floatList = pythonApiService.getStrVector(getVectorVO);
+                Patent patent1 = new Patent();
+                PatentJoin patentJoin = new PatentJoin();
+                patentJoin.setParent(patentId);
+                patentJoin.setName("patent_vector");
+                patent1.setPatentJoin(patentJoin);
+                patent1.setAbstractVector(floatList);
+                esService.addChildPatent(patent1, patentId);
+            }
+        }
+
+    }
+
+    @Async("singleThreadAsyncTaskExecutor")
+    public void asyncAddPatentVector(Patent patent, String id) throws Exception {
+        this.addPatentVectorToEs(patent, id);
+    }
+
+    public void refreshPatentVector(Integer id) {
+        if (id != null) {
+        }
+
+
+    }
+}

+ 25 - 0
src/main/java/cn/cslg/pas/service/common/PythonApiService.java

@@ -1,6 +1,7 @@
 package cn.cslg.pas.service.common;
 
 import cn.cslg.pas.common.core.base.RedisConf;
+import cn.cslg.pas.common.model.es.GetVectorVO;
 import cn.cslg.pas.common.model.pythonModel.GetPatentSimilarScoreDTO;
 import cn.cslg.pas.common.model.pythonModel.GetPatentSimilarScoreVO;
 import cn.cslg.pas.common.model.pythonModel.PatentScoreDTO;
@@ -16,6 +17,7 @@ import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.service.business.TechnicalCaseService;
 import cn.cslg.pas.service.importPatent.WebVOTransformService;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.google.gson.Gson;
 import okhttp3.MediaType;
@@ -144,4 +146,27 @@ public class PythonApiService {
 
         return waitTOGetDTOs;
     }
+
+
+
+    public List<Float> getStrVector(GetVectorVO getVectorVO){
+
+        try {
+            OkHttpClient okHttpClient = new OkHttpClient();
+            String param = new Gson().toJson(getVectorVO);
+            RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+            Request request = new Request.Builder()
+                    .url(PythonUrl + "/getVector")
+                    .post(requestBody)
+                    .build();
+            String reStr = Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+            List<Float> floats = JSONArray.parseArray(reStr, Float.class);
+            return floats;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "获取向量失败");
+        }
+
+
+    }
 }

+ 4 - 4
src/main/java/cn/cslg/pas/service/importPatent/SavePatentToEsThread.java

@@ -11,10 +11,7 @@ import cn.cslg.pas.domain.es.Patent;
 import cn.cslg.pas.domain.es.PatentJoin;
 import cn.cslg.pas.service.business.CompareLiteratureService;
 import cn.cslg.pas.service.business.ImportTaskService;
-import cn.cslg.pas.service.business.es.EsCustomFieldService;
-import cn.cslg.pas.service.business.es.EsMergePersonService;
-import cn.cslg.pas.service.business.es.EsProductPatentService;
-import cn.cslg.pas.service.business.es.EsService;
+import cn.cslg.pas.service.business.es.*;
 import cn.cslg.pas.service.common.FileManagerService;
 import cn.cslg.pas.service.common.MessageService;
 import cn.cslg.pas.service.common.PatentStarApiService;
@@ -110,6 +107,9 @@ public class SavePatentToEsThread extends Thread {
                 //判断是否和专题库或报告关联
                 ImportTaskAMVO importTaskAMVO = taskThread.getImportTaskAMVO();
 
+                //添加专利向量信息
+                EsPatentVectorService esPatentVectorService = applicationContext.getBean(EsPatentVectorService.class);
+                 esPatentVectorService.asyncAddPatentVector(orgPatent,patentId);
                 //和专题库或报告进行关联
                 if (importTaskAMVO.getProjectId() != null) {
 

+ 1 - 1
src/main/resources/application-dev.yml

@@ -65,7 +65,7 @@ PCSUrl: http://192.168.2.24:8871
 #OPSUrl: http://192.168.2.24:5001
 OPSUrl: http://139.224.24.90:5001
 PASUrl: http://localhost:8879
-FMSUrl: http://localhost:8803
+FMSUrl: http://192.168.2.24:8803
 WDUrl: http://1.116.113.26:81
 PythonUrl: http://localhost:8001
 FileSource: 1

Dosya farkı çok büyük olduğundan ihmal edildi
+ 11 - 0
src/test/java/cn/cslg/pas/getSimilarTest.java