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