chenyi vor 1 Jahr
Ursprung
Commit
56ff432ae9

+ 60 - 4
pom.xml

@@ -1,11 +1,10 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.5.9</version>
+        <version>3.1.3</version>
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
     <groupId>com.test.xiaoshi</groupId>
@@ -15,6 +14,8 @@
     <description>这是专用于写测试Demo的项目</description>
     <properties>
         <java.version>1.8</java.version>
+        <okhttps.version>4.10.0</okhttps.version>
+        <elasticsearch.version>8.6.1</elasticsearch.version>
     </properties>
     <dependencies>
         <dependency>
@@ -27,6 +28,42 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>com.ejlchina</groupId>
+            <artifactId>okhttps</artifactId>
+            <version>3.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>3.14.9</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <version>3.1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
@@ -86,4 +123,23 @@
         </dependency>
     </dependencies>
 
+    <!--阿里云镜像源(因需要提交到GithubActions,会引起依赖下载过慢的问题)-->
+    <repositories>
+        <repository>
+            <id>nexus-aliyun</id>
+            <name>nexus-aliyun</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+        <repository>
+            <id>com.e-iceblue</id>
+            <name>e-iceblue</name>
+            <url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
 </project>

+ 6 - 0
src/main/java/com/test/xiaoshi/test/XiaoshiTestApplication.java

@@ -1,13 +1,19 @@
 package com.test.xiaoshi.test;
 
 import org.springframework.boot.SpringApplication;
+import org.springframework.boot.SpringBootConfiguration;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.scheduling.annotation.EnableAsync;
 
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
+@EnableCaching
 @SpringBootApplication
+@EnableAsync
+@SpringBootConfiguration
 public class XiaoshiTestApplication {
 
     public static void main(String[] args) {

+ 67 - 0
src/main/java/com/test/xiaoshi/test/common/util/ElasticSearchClientConfig.java

@@ -0,0 +1,67 @@
+package com.test.xiaoshi.test.common.util;
+
+import co.elastic.clients.elasticsearch.ElasticsearchClient;
+import co.elastic.clients.json.jackson.JacksonJsonpMapper;
+import co.elastic.clients.transport.ElasticsearchTransport;
+import co.elastic.clients.transport.rest_client.RestClientTransport;
+import org.apache.http.HttpHost;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.elasticsearch.client.RestClient;
+import org.elasticsearch.client.RestClientBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.net.ssl.SSLContext;
+
+
+@Configuration
+public class ElasticSearchClientConfig {
+    //配置RestHighLevelClient依赖到spring容器中待用
+
+    @Configuration
+    public class ElasticSearchConfig {
+        //注入IOC容器
+        @Bean
+        public ElasticsearchClient elasticsearchClient() throws Exception {
+            RestClientBuilder builder = RestClient.builder(new HttpHost("192.168.1.24", 9200, "https"));
+            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "xiaoshi221101"));
+            SSLContext sslContext = SSLContextBuilder.create()
+                    .loadTrustMaterial(new TrustSelfSignedStrategy())
+                    .build();
+            builder.setHttpClientConfigCallback(f -> f.setDefaultCredentialsProvider(credentialsProvider).setSSLContext(sslContext).setSSLHostnameVerifier(new NoopHostnameVerifier()));
+            RestClient client =builder.build();
+            ElasticsearchTransport transport = new RestClientTransport(client,new JacksonJsonpMapper());
+            return new ElasticsearchClient(transport);
+        }
+//                @Bean
+//                public ElasticsearchClient elasticsearchClient() throws Exception {
+//                    RestClientBuilder builder = RestClient.builder(new HttpHost("47.101.137.223", 9200, "http"));
+//                    RestClient client = builder.build();
+//                    ElasticsearchTransport transport = new RestClientTransport(client, new JacksonJsonpMapper());
+//
+//                    return new ElasticsearchClient(transport);
+//                }
+
+
+//        @Bean
+//        public ElasticsearchClient elasticsearchClient() throws Exception {
+//            RestClientBuilder builder = RestClient.builder(new HttpHost("47.101.137.223", 9200, "http"));
+//            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+//            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "xiaoshi221101"));
+//            SSLContext sslContext = SSLContextBuilder.create()
+//                    .loadTrustMaterial(new TrustSelfSignedStrategy())
+//                    .build();
+//            builder.setHttpClientConfigCallback(f -> f.setDefaultCredentialsProvider(credentialsProvider).setSSLContext(sslContext).setSSLHostnameVerifier(new NoopHostnameVerifier()));
+//            RestClient client =builder.build();
+//            ElasticsearchTransport transport = new RestClientTransport(client,new JacksonJsonpMapper());
+//            return new ElasticsearchClient(transport);
+//        }
+    }
+}

+ 3 - 2
src/main/java/com/test/xiaoshi/test/controller/OpencvController.java

@@ -10,13 +10,14 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController
-@RequestMapping( "client")
+@RequestMapping("client")
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class OpencvController {
     private final ImageFeatureService imageFeatureService;
+
     @PostMapping("/add")
     public String addClient() {
         imageFeatureService.getImage();
-return "";
+        return "";
     }
 }

+ 23 - 0
src/main/java/com/test/xiaoshi/test/entity/pojo/es/PatentPerson.java

@@ -0,0 +1,23 @@
+package com.test.xiaoshi.test.entity.pojo.es;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.stereotype.Component;
+
+@Component
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PatentPerson {
+    @JsonProperty("name")
+    String name;
+
+    @JsonProperty("order")
+    Integer order;
+
+    @JsonProperty("type")
+    String type;
+}

+ 31 - 0
src/main/java/com/test/xiaoshi/test/entity/pojo/es/Tender.java

@@ -0,0 +1,31 @@
+package com.test.xiaoshi.test.entity.pojo.es;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Tender {
+
+    @JsonProperty("applicant")
+    private List<PatentPerson> applicant;
+
+    @JsonProperty("name")
+    private String name;
+
+    @JsonProperty("other_field")
+    private String otherField;
+
+    @JsonProperty("value")
+    private Integer value;
+
+    @JsonProperty("my_vector")
+    private List<Float> myVector;
+}

+ 78 - 0
src/main/java/com/test/xiaoshi/test/service/EsService.java

@@ -0,0 +1,78 @@
+package com.test.xiaoshi.test.service;
+
+import co.elastic.clients.elasticsearch.ElasticsearchClient;
+import co.elastic.clients.elasticsearch._types.InlineScript;
+import co.elastic.clients.elasticsearch._types.Script;
+import co.elastic.clients.elasticsearch._types.query_dsl.MatchAllQuery;
+import co.elastic.clients.elasticsearch._types.query_dsl.Query;
+import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
+import co.elastic.clients.elasticsearch.core.IndexResponse;
+import co.elastic.clients.elasticsearch.core.SearchRequest;
+import co.elastic.clients.elasticsearch.core.SearchResponse;
+import co.elastic.clients.elasticsearch.core.search.Hit;
+import co.elastic.clients.json.JsonData;
+import com.test.xiaoshi.test.entity.pojo.es.Tender;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
+public class EsService {
+    private final ElasticsearchClient client;
+    private MatchAllQuery.Builder i;
+
+    public String addTender(Tender tender) throws Exception {
+        IndexResponse indexResponse = client.index(i -> i
+                .index("tender")
+                //传入user对象
+                .document(tender)
+        );
+        return indexResponse.id();
+    }
+
+    public Tender get(String patentNo) throws Exception {
+        Tender tender = new Tender();
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        //设置查询索引
+        builder.index("tender");
+        Query query = QueryBuilders.matchAll(i -> i.queryName(""));
+        builder.query(query);
+        SearchResponse<Tender> response = client.search(builder.build(), Tender.class);
+        List<Hit<Tender>> hits = response.hits().hits();
+        if (hits != null && hits.size() > 0) {
+            tender = hits.get(0).source();
+        }
+        return tender;
+    }
+
+
+    public List<Tender> getTenderList(List<Float> imageList) throws IOException {
+        List<Tender> list = new ArrayList<>();
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        //设置查询索引
+        builder.index("tender");
+
+        String source = "cosineSimilarity(params.queryVector, 'my_vector') + 1.0";
+        InlineScript inlineScript = InlineScript.of(i -> i.lang("painless").params("queryVector", JsonData.of(imageList)).source(source));
+        Script script = Script.of(i -> i.inline(inlineScript));
+        Query query = QueryBuilders.scriptScore(i -> i.script(script).query(org.springframework.data.elasticsearch.client.elc.QueryBuilders.matchAllQueryAsQuery()));
+        builder.query(query);
+        builder.size(10);
+        SearchResponse<Tender> response = client.search(builder.build(), Tender.class);
+        List<Hit<Tender>> hits = response.hits().hits();
+        double scoreThreshold = 1.95;
+        for (Hit<Tender> hit : hits) {
+            Double score = hit.score();
+            Tender tender = hit.source();
+            if (score > scoreThreshold) {
+                list.add(tender);
+            }
+        }
+        return list;
+    }
+}

+ 42 - 4
src/main/java/com/test/xiaoshi/test/service/ImageFeatureService.java

@@ -4,6 +4,8 @@ import org.opencv.core.*;
 import org.opencv.features2d.DescriptorExtractor;
 import org.opencv.features2d.FeatureDetector;
 import org.opencv.features2d.Features2d;
+import org.opencv.features2d.ORB;
+import org.opencv.imgcodecs.Imgcodecs;
 import org.opencv.imgproc.Imgproc;
 import org.springframework.stereotype.Service;
 
@@ -12,6 +14,9 @@ import java.awt.image.BufferedImage;
 import java.awt.image.DataBufferByte;
 import java.io.File;
 import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 @Service
 public class ImageFeatureService {
@@ -22,10 +27,12 @@ public class ImageFeatureService {
         Mat matImage = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3);
         byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
         matImage.put(0, 0, data);
-System.out.println(matImage.type());
+        System.out.println(matImage.type());
         // 转换为灰度图像(如果需要)  
         Mat grayImage = new Mat();
         Imgproc.cvtColor(matImage, grayImage, Imgproc.COLOR_BGR2GRAY);
+
+
         // 初始化特征检测器和描述子提取器  
         FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
         DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
@@ -38,6 +45,9 @@ System.out.println(matImage.type());
         Mat descriptors = new Mat();
         extractor.compute(grayImage, keyPoints, descriptors);
         matImage.convertTo(descriptors, CvType.CV_32F);
+        String dump = descriptors.dump();
+        System.out.println("AAAAA:" + dump);
+
         System.out.println(descriptors.type());
         // 将描述子转换为float数组  
         float[] featureVector = new float[descriptors.cols() * descriptors.rows()];
@@ -45,17 +55,45 @@ System.out.println(matImage.type());
         return featureVector;
     }
 
-    public void getImage() {
-        File file = new File("D:\\xiaoshi-test\\target\\zxy.jpg");
+    public String getDump(BufferedImage image) {
+        // 读取图像
+        Mat img = Imgcodecs.imread("F:\\file\\test\\xx.jpg");
+
+        // 初始化ORB检测器
+        FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
+
+        // 检测关键点
+        detector.detect(img, keypoints);
+
+        // 初始化ORB描述子提取器
+        ORB orb = ORB.create();
+        Mat descriptors = new Mat();
+
+        // 计算描述子
+        orb.compute(img, keypoints, descriptors);
+
+        // 输出描述子,这就是你的特征向量
+        System.out.println(descriptors.dump());
+        return descriptors.dump();
+    }
+
+    public List<Float> getImage() {
+        List<Float> floats = new ArrayList<>();
+        File file = new File("F:\\file\\test\\xx.jpg");
         try {
             FileInputStream fileInputStream = new FileInputStream(file);
             BufferedImage image = ImageIO.read(fileInputStream);
             float[] featureVector = this.extractFeatures(image);
             System.out.println(featureVector);
+            for (float v : featureVector) {
+                floats.add(v);
+            }
         } catch (Exception e) {
             e.printStackTrace();
         }
+        return floats;
+    }
 
 
-    }
 }

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

@@ -1,7 +1,7 @@
 server:
   servlet:
     context-path: /
-  port: 8871
+  port: 8891
 sa-token:
   activity-timeout: 18000
   token-name: token

+ 77 - 0
src/test/java/OpenCvTest.java

@@ -0,0 +1,77 @@
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.test.xiaoshi.test.XiaoshiTestApplication;
+import com.test.xiaoshi.test.entity.pojo.es.Tender;
+import com.test.xiaoshi.test.service.EsService;
+import com.test.xiaoshi.test.service.ImageFeatureService;
+import jakarta.annotation.Resource;
+import org.junit.jupiter.api.Test;
+import org.opencv.core.Mat;
+import org.opencv.core.MatOfKeyPoint;
+import org.opencv.features2d.FeatureDetector;
+import org.opencv.features2d.ORB;
+import org.opencv.imgcodecs.Imgcodecs;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.List;
+
+@SpringBootTest(classes = XiaoshiTestApplication.class)
+public class OpenCvTest {
+
+    @Autowired
+    private EsService esService;
+
+    @Autowired
+    private ImageFeatureService imageFeatureService;
+
+
+    @Test
+    public void test() throws Exception {
+        List<Float> image = imageFeatureService.getImage();
+        List<Float> list = image.subList(0, 6);
+        Tender tender = new Tender();
+        tender.setName("lisa");
+        tender.setValue(7);
+        tender.setOtherField("eeeee");
+        tender.setMyVector(list);
+        String s = esService.addTender(tender);
+        System.out.println(s);
+    }
+
+    @Test
+    public void test1() throws Exception {
+        List<Float> image = imageFeatureService.getImage();
+        List<Float> list = image.subList(0, 6);
+        List<Tender> tenderList = esService.getTenderList(list);
+        System.out.println(tenderList);
+    }
+
+    @Test
+    public void test2() throws Exception {
+        // 读取图像
+        Mat img = Imgcodecs.imread("F:\\file\\test\\xx.jpg");
+
+        // 初始化ORB检测器
+        FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
+        MatOfKeyPoint keypoints = new MatOfKeyPoint();
+
+        // 检测关键点
+        detector.detect(img, keypoints);
+
+        // 初始化ORB描述子提取器
+        ORB orb = ORB.create();
+        Mat descriptors = new Mat();
+
+        // 计算描述子
+        orb.compute(img, keypoints, descriptors);
+        String dump = descriptors.dump();
+
+        // 输出描述子,这就是你的特征向量
+        System.out.println(dump);
+
+    }
+
+
+}