From df26a8dd98db8b0ef77bc74fba4d13575fa70903 Mon Sep 17 00:00:00 2001
From: luogw <3132758203@qq.com>
Date: Mon, 26 Jan 2026 15:39:25 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=90=91=E9=87=8F?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 20 +++
.../project/milvus/config/MilvusConfig.java | 23 +++
.../milvus/controller/MilvusController.java | 16 +++
.../project/milvus/domain/TitleVector.java | 34 +++++
.../milvus/service/MilvusDemoService.java | 31 ++++
.../service/impl/MilvusDemoServiceImpl.java | 133 ++++++++++++++++++
src/main/resources/application.yml | 6 +-
7 files changed, 262 insertions(+), 1 deletion(-)
create mode 100644 src/main/java/com/project/milvus/config/MilvusConfig.java
create mode 100644 src/main/java/com/project/milvus/controller/MilvusController.java
create mode 100644 src/main/java/com/project/milvus/domain/TitleVector.java
create mode 100644 src/main/java/com/project/milvus/service/MilvusDemoService.java
create mode 100644 src/main/java/com/project/milvus/service/impl/MilvusDemoServiceImpl.java
diff --git a/pom.xml b/pom.xml
index 35350c4..12d1395 100644
--- a/pom.xml
+++ b/pom.xml
@@ -146,5 +146,25 @@
org.apache.commons
commons-pool2
+
+
+
+ io.milvus
+ milvus-sdk-java
+ 2.5.4
+
+
+ com.google.protobuf
+ protobuf-java
+
+
+
+
+ com.google.protobuf
+ protobuf-java
+ 3.24.0
+ compile
+
+
diff --git a/src/main/java/com/project/milvus/config/MilvusConfig.java b/src/main/java/com/project/milvus/config/MilvusConfig.java
new file mode 100644
index 0000000..4d17910
--- /dev/null
+++ b/src/main/java/com/project/milvus/config/MilvusConfig.java
@@ -0,0 +1,23 @@
+package com.project.milvus.config;
+
+import io.milvus.v2.client.ConnectConfig;
+import io.milvus.v2.client.MilvusClientV2;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MilvusConfig {
+
+ @Value("${milvus.host}")
+ private String host;
+ @Value("${milvus.port}")
+ private String port;
+
+ @Bean
+ public MilvusClientV2 milvusClient(){
+ String uri = "http://"+host+":"+port;
+ ConnectConfig connectConfig = ConnectConfig.builder().uri(uri).build();
+ return new MilvusClientV2(connectConfig);
+ }
+}
diff --git a/src/main/java/com/project/milvus/controller/MilvusController.java b/src/main/java/com/project/milvus/controller/MilvusController.java
new file mode 100644
index 0000000..49aa46e
--- /dev/null
+++ b/src/main/java/com/project/milvus/controller/MilvusController.java
@@ -0,0 +1,16 @@
+package com.project.milvus.controller;
+
+import com.project.milvus.service.MilvusDemoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+@RestController
+@RequestMapping("/milvus")
+public class MilvusController {
+ @Autowired
+ private MilvusDemoService milvusDemoService;
+
+
+
+}
diff --git a/src/main/java/com/project/milvus/domain/TitleVector.java b/src/main/java/com/project/milvus/domain/TitleVector.java
new file mode 100644
index 0000000..c30d7f1
--- /dev/null
+++ b/src/main/java/com/project/milvus/domain/TitleVector.java
@@ -0,0 +1,34 @@
+package com.project.milvus.domain;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class TitleVector {
+ public Long id;
+ //知识点ID
+ public List pointIds;
+ //题目向量
+ public List titleVector;
+
+ public JsonElement getPointIdsJson() {
+ Gson gson = new Gson();
+ return gson.toJsonTree(pointIds);
+ }
+
+ public List getPointIdsList() {
+ return pointIds;
+ }
+
+ public JsonElement getTitleVectorJson() {
+ Gson gson = new Gson();
+ return gson.toJsonTree(titleVector);
+ }
+
+ public List getTitleVectorList() {
+ return titleVector;
+ }
+}
diff --git a/src/main/java/com/project/milvus/service/MilvusDemoService.java b/src/main/java/com/project/milvus/service/MilvusDemoService.java
new file mode 100644
index 0000000..ef068d1
--- /dev/null
+++ b/src/main/java/com/project/milvus/service/MilvusDemoService.java
@@ -0,0 +1,31 @@
+package com.project.milvus.service;
+
+import com.project.milvus.domain.TitleVector;
+import io.milvus.v2.service.vector.response.GetResp;
+import io.milvus.v2.service.vector.response.SearchResp;
+
+import java.util.List;
+
+public interface MilvusDemoService {
+
+ /**
+ * 创建一个Collection
+ */
+ void createCollection();
+
+ /**
+ * 插入向量
+ */
+ void insertRecord(TitleVector vector);
+
+ /**
+ * 查询向量
+ */
+ GetResp getRecord(String id);
+
+
+ /**
+ * 查询关联知识点相似度最大的题目
+ */
+ List> query(List point_id,List titleVector);
+}
diff --git a/src/main/java/com/project/milvus/service/impl/MilvusDemoServiceImpl.java b/src/main/java/com/project/milvus/service/impl/MilvusDemoServiceImpl.java
new file mode 100644
index 0000000..9c6585c
--- /dev/null
+++ b/src/main/java/com/project/milvus/service/impl/MilvusDemoServiceImpl.java
@@ -0,0 +1,133 @@
+package com.project.milvus.service.impl;
+
+import com.google.gson.JsonObject;
+import com.project.milvus.domain.TitleVector;
+import com.project.milvus.service.MilvusDemoService;
+import io.milvus.v2.client.MilvusClientV2;
+import io.milvus.v2.common.DataType;
+import io.milvus.v2.common.IndexParam;
+import io.milvus.v2.service.collection.request.AddFieldReq;
+import io.milvus.v2.service.collection.request.CreateCollectionReq;
+import io.milvus.v2.service.vector.request.GetReq;
+import io.milvus.v2.service.vector.request.InsertReq;
+import io.milvus.v2.service.vector.request.SearchReq;
+import io.milvus.v2.service.vector.request.data.FloatVec;
+import io.milvus.v2.service.vector.response.GetResp;
+import io.milvus.v2.service.vector.response.InsertResp;
+import io.milvus.v2.service.vector.response.SearchResp;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+
+@Service
+@Slf4j
+public class MilvusDemoServiceImpl implements MilvusDemoService {
+ //集合名称
+ private static final String COLLECTION_NAME = "titleCollection";
+
+ private final MilvusClientV2 client ;
+ //创建向量数据库连接
+ public MilvusDemoServiceImpl(MilvusClientV2 client ) {
+ this.client = client ;
+ }
+
+ /**
+ * 创建一个Collection
+ */
+ @Override
+ public void createCollection() {
+ CreateCollectionReq.CollectionSchema schema = client.createSchema();
+
+ schema.addField(AddFieldReq.builder()
+ .fieldName("id")
+ .dataType(DataType.Int64)
+ .isPrimaryKey(true)
+ .autoID(false)
+ .build());
+
+ schema.addField(AddFieldReq.builder()
+ .fieldName("point_ids")
+ .dataType(DataType.Array)
+ .elementType(DataType.Int64)
+ .maxCapacity(100)
+ .build());
+
+ schema.addField(AddFieldReq.builder()
+ .fieldName("title_vector")
+ .dataType(DataType.FloatVector)
+ .dimension(1024)
+ .build());
+
+ IndexParam indexParam = IndexParam.builder()
+ .fieldName("title_vector")
+ .metricType(IndexParam.MetricType.COSINE)
+ .build();
+
+ CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()
+ .collectionName(COLLECTION_NAME)
+ .collectionSchema(schema)
+ .indexParams(Collections.singletonList(indexParam))
+ .build();
+
+ client.createCollection(createCollectionReq);
+ }
+
+ /**
+ * 往collection中插入一条数据
+ */
+ public void insertRecord(TitleVector title) {
+ JsonObject vector = new JsonObject();
+ vector.addProperty("id", title.getId());
+ vector.add("point_ids", title.getPointIdsJson());
+ vector.add("title_vector", title.getTitleVectorJson());
+
+ InsertReq insertReq = InsertReq.builder()
+ .collectionName(COLLECTION_NAME)
+ .data(Collections.singletonList(vector))
+ .build();
+ InsertResp resp = client.insert(insertReq);
+
+ }
+
+ /**
+ * 通过ID获取记录
+ */
+ public GetResp getRecord(String id) {
+ GetReq getReq = GetReq.builder()
+ .collectionName(COLLECTION_NAME)
+ .ids(Collections.singletonList(id))
+ .build();
+ GetResp resp = client.get(getReq);
+ return resp;
+ }
+
+ /**
+ * 查询关联知识点相似度最大的题目
+ */
+ @Override
+ public List> query(List pointIds,List titleVector){
+ StringBuffer expr = new StringBuffer();
+ for (int i = 0; i < pointIds.size(); i++) {
+ if(i == pointIds.size() - 1){
+ expr.append("array_contains(point_ids, " + pointIds.get(i) + ")");
+ continue;
+ }
+ expr.append("array_contains(point_ids, " + pointIds.get(i) + ") and ");
+ }
+
+ SearchResp searchReq = client.search(SearchReq.builder()
+ .collectionName(COLLECTION_NAME)
+ .data(Collections.singletonList(new FloatVec(titleVector)))
+ .topK(1)
+ .filter(expr.toString())
+ .outputFields(Collections.singletonList("*"))
+ .metricType(IndexParam.MetricType.COSINE) // 余弦相似度
+ .build());
+
+ return searchReq.getSearchResults();
+ }
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index c0baedc..414c3f3 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -36,4 +36,8 @@ mybatis-plus:
configuration:
map-underscore-to-camel-case: true
mapper-locations: classpath*:mapper/**/*.xml
- type-aliases-package: com.proposal.**.domain.entity
\ No newline at end of file
+ type-aliases-package: com.proposal.**.domain.entity
+
+milvus:
+ host: 172.16.204.50
+ port: 19530
\ No newline at end of file