JAVA25+Spring Boot 4.1.0 +Spring AI 2.0.1 向量数据库milvus 基础功能实现

发布时间:2026/11/4 19:58:54

JAVA25+Spring Boot 4.1.0 +Spring AI 2.0.1 向量数据库milvus 基础功能实现 前置文章JAVA25 Spring Boot 4.1.0 Spring AI 2.0.1 调用 DeepSeek 模型JAVA25 Spring Boot 4.1.0 Spring AI 2.0.1 加载本地 embeddings 模型 bge-m3前言向量数据库是一种特殊类型的数据库在人工智能应用中扮演着至关重要的角色。向量数据库的查询方式与传统关系型数据库有所不同它不进行精确匹配而是执行相似性搜索。当以向量作为查询条件时向量数据库会返回与查询向量“相似”的向量。关于相似度的具体计算方式请参阅“向量相似性”一节。向量数据库用于将数据与人工智能模型集成。使用向量数据库的第一步是把数据加载到向量数据库中随后当用户向人工智能模型发起查询时系统会先检索出一组相似的文档这些文档将作为用户问题的上下文与用户的查询一并发送给人工智能模型。这种技术被称为检索增强生成RAG。Spring AI 提供了大量接口支持多种向量数据库实现并附有若干进阶用法示例。详细信息可查阅官方文档Spring AI 官网 Vector DatabasesSpring AI 官网 Vector Databases Milvus本文在前置文章的基础上进一步扩展讲解如何在项目中使用 Spring AI 对接 Milvus 向量数据库。注意请务必先完成前置文章JAVA25 Spring Boot 4.1.0 Spring AI 2.0.1 加载本地 embeddings 模型 bge-m3中的配置否则项目启动时会报错。一、安装 Milvus 3.0.xMilvus 3.0.x 版本里面会更新了很多功能为了以后扩展建议安装 Milvus 3.0.x。Milvus 官网Milvus 官网安装页面安装 Milvuswgethttps://github.com/milvus-io/milvus/releases/download/v3.0.3/milvus-standalone-docker-compose.yaml-Odocker-compose.yamlsudodockercompose up-dCreating milvus-etcd...doneCreating milvus-minio...doneCreating milvus-standalone...done注意指令在哪个文件夹下运行会在当前目录创建数据文件创建的数据文件记得给权限否则docker 启动有可能报错。停止并删除 Milvussudodockercompose downsudorm-rfvolumes安装 Milvus 连接工具Attu 首页下载 Attu 页面二、Maven 引入!-- Milvus 向量存储 Spring AI 官方 Starter --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-vector-store-milvus/artifactId/dependency三、添加 application.yml 配置# Spring 配置spring:# Spring AI 配置 ai:# 向量库配置 vectorstore:# Milvus 向量库配置 milvus:client:# 连接 Milvus 向量库 IPhost:121.43.122.232# 连接 Milvus 向量库端口port:19530# username: root# password: Milvus#默认数据库名称databaseName:default#数据库中集合名称collectionName:vector_store#存入 Milvus 的向量Embedding的维度大小 务必与 向量化模型 输出维度一致embeddingDimension:1024# 索引类型 IVF_FLAT适合中等规模数据平衡查询速度和精度indexType:IVF_FLAT# 相似度度量类型 COSINE 余弦相似度常用于文本向量metricType:COSINE#是否要为你自动在 Milvus 中创建用于存储向量数据的集合Collection及其结构SchemainitializeSchema:true四、创建 DTO向量新增修改请求参数记录对象importio.swagger.v3.oas.annotations.media.Schema;importlombok.*;importlombok.experimental.Accessors;importorg.springframework.ai.document.Document;importjava.io.Serial;importjava.io.Serializable;importjava.util.List;/** * description: 向量新增修改请求参数记录对象 * author: LIHAO * createDate: 2026-11-02 17:13:49 */DataBuilder(toBuildertrue)WithNoArgsConstructorAllArgsConstructorAccessors(chaintrue)Schema(title向量新增修改请求参数对象)publicclassVectorUpsertRequestimplementsSerializable{SerialprivatestaticfinallongserialVersionUID1L;Schema(description存储名称用于标识使用的向量存储实例RedisVectorStore Bean名称主要作用获取集合名称如果传递collectionName参数以collectionName参数为主。没有传递以storeBeanName获取为主)privateStringstoreBeanName;Schema(description集合名称)privateStringcollectionName;Schema(description分区名称一个数据库中一个集合里面的不同分区名称)privateStringpartitionName;Schema(description拆分好的文档数据,requiredModeSchema.RequiredMode.REQUIRED)privateListDocumentdocumentList;}向量检索请求参数importio.swagger.v3.oas.annotations.media.Schema;importlombok.*;importlombok.experimental.Accessors;importjava.io.Serial;importjava.io.Serializable;importjava.util.List;/** * description: 向量检索请求参数 * author: LIHAO * createDate: 2026-11-02 17:13:58 */DataBuilder(toBuildertrue)WithNoArgsConstructorAllArgsConstructorAccessors(chaintrue)Schema(title向量检索请求参数对象)publicclassVectorQueryRequestimplementsSerializable{SerialprivatestaticfinallongserialVersionUID1L;Schema(description向量数据id)privateStringid;Schema(description向量数据id集合)privateListStringidList;Schema(description存储Bean名称用于标识使用的向量存储实例RedisVectorStore Bean名称)(主要作用获取集合名称如果传递collectionName参数以collectionName参数为主。没有传递以storeBeanName获取为主))privateStringstoreBeanName;Schema(description集合名称)privateStringcollectionName;Schema(description分区名称一个数据库中一个集合里面有不同分区名称)privateStringpartitionName;Schema(description检索文本,requiredModeSchema.RequiredMode.AUTO)privateStringtext;Schema(description返回结果数量可为空使用系统默认值通常为4)privateIntegertopK;Schema(description相似度阈值仅返回相似度高于此值的文档范围通常为0~1可为空系统默认值通常为0.0无阈值限制)privateFloatsimilarityThreshold;Schema(description是否重排序true重排序false不重排序)privateBooleanisReranker;Schema(description元数据过滤条件用于在检索时对文档元数据进行过滤如果添加向量时是章节拆分默认添加元数据字段fileName文件名称、chapters章、section节、subsection小节、detailedChapters章/节/小节语法示例metadata[country] UK metadata[year] 2020 metadata[isActive] true Or metadata[country] BG (metadata[city] NOT IN [Sofia, Plovdiv] || price 134.34))privateStringmetaDataWhere;Schema(description分词匹配词间隔位置允许匹配词之间最多间隔几个位置0代表必须相邻中间没有间隔位置。只限于短语匹配)privateIntegerslop;}五、创建向量库操作 Serviceimportcom.lh.vectorDatabases.milvus.dto.VectorQueryRequest;importcom.lh.vectorDatabases.milvus.dto.VectorUpsertRequest;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.collections4.CollectionUtils;importorg.apache.commons.lang3.StringUtils;importorg.springframework.ai.document.Document;importorg.springframework.ai.vectorstore.SearchRequest;importorg.springframework.ai.vectorstore.VectorStore;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.util.Assert;importjava.util.List;importjava.util.Map;/** * description: Milvus Store 向量操作 * author: LIHAO * createDate: 2026-11-02 15:05:58 */Slf4jService(milvusVectorStoreService)publicclassMilvusVectorStoreService{privateVectorStorevectorStore;publicMilvusVectorStoreService(VectorStorevectorStore){this.vectorStorevectorStore;}/** * description: 新增或修改向量数据 * author: LIHAO * createDate: 2026-11-02 17:16:58 * param: [storeBeanName RedisVectorStore Bean名称, documentList] * return: void */publicvoidupsert(VectorUpsertRequestvectorAddRequest){ListDocumentdocumentParamtListvectorAddRequest.getDocumentList();// 检查集合不为空Assert.notEmpty(documentParamtList,MilvusVectorStoreService#upsert参数vectorRequest#documentList不能为空);//新增或修改数据vectorStore.add(documentParamtList);}/** * description: 根据数据id据删除数据 * author: LIHAO * createDate: 2026-11-02 17:16:58 * param: [storeBeanName RedisVectorStore Bean名称, idList 数据id] * return: void */publicvoiddeleteById(VectorQueryRequestvectorRequest){ListStringidListvectorRequest.getIdList();// 检查集合不为空Assert.notEmpty(idList,MilvusVectorStoreService#deleteById参数vectorRequest#idList不能为空);if(CollectionUtils.isNotEmpty(idList)){//删除数据vectorStore.delete(idList);}}/** * description: 根据文本查询相关向量数据如语义搜索 * author: LIHAO * createDate: 2026-11-02 17:16:58 * param: [vectorRequest] * return: java.util.Listorg.springframework.ai.document.Document */publicListDocumentsearchByVector(VectorQueryRequestvectorRequest){//搜索内容StringtextvectorRequest.getText();//检查字符串不为空不是 null且长度 0Assert.hasLength(text,MilvusVectorStoreService#searchByVector,参数vectorRequest#text不能为空);// 构建 SearchRequest先设置固定参数SearchRequest.BuilderbuilderSearchRequest.builder().query(vectorRequest.getText());// 查询文本//获取搜索结果数量IntegertopKvectorRequest.getTopK();// 仅当 topK 不为 null 时才设置 topK否则使用系统默认值4由 RedisVectorStore 决定if(topK!nulltopK0){builder.topK(topK);}//获取相似度阈值仅返回相似度高于此值的文档范围通常为0~1可为空系统默认值通常为0.0无阈值限制FloatsimilarityThresholdvectorRequest.getSimilarityThreshold();// similarityThreshold 不为 null 时才设置 similarityThreshold否则使用系统默认值0.0由 RedisVectorStore 决定if(similarityThreshold!nullsimilarityThreshold0.0similarityThreshold1.0){builder.similarityThreshold(similarityThreshold);// 相似度阈值若为 nullbuilder 可能使用默认值}//元数据过滤条件用于在检索时对文档元数据进行过滤StringmetaDataWherevectorRequest.getMetaDataWhere();// 判断是否有元数据过滤if(StringUtils.isNotBlank(metaDataWhere)){builder.filterExpression(metaDataWhere);// 元数据过滤条件 metaDataWhere}// 生成最终的 SearchRequest 对象SearchRequestsearchRequestbuilder.build();//查询向量数据ListDocumentresultsvectorStore.similaritySearch(searchRequest);returnresults;}}六、测试用例Maven 引入!-- Milvus 向量存储 Spring AI 官方 Starter --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-vector-store-milvus/artifactId/dependencyjava代码importcom.lh.vectorDatabases.milvus.dto.VectorQueryRequest;importcom.lh.vectorDatabases.milvus.dto.VectorUpsertRequest;importcom.lh.vectorDatabases.milvus.service.MilvusVectorStoreService;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.collections4.CollectionUtils;importorg.junit.jupiter.api.Test;importorg.springframework.ai.document.Document;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importjava.util.List;importjava.util.Map;Slf4jSpringBootTestpublicclassOriginApplicationTest{AutowiredprivateMilvusVectorStoreServicemilvusVectorStoreService;TestpublicvoidmilvusVectorStoreTest(){ListDocumentdocumentsList.of(newDocument(今天天气很好,Map.of(meta1,meta1)),newDocument(世界很大救赎就在拐角处),newDocument(你面对过去向前走然后转身面向未来。,Map.of(meta2,meta2)));//新增数据milvusVectorStoreService.upsert(VectorUpsertRequest.builder().documentList(documents).build());//查询数据ListDocumentresultsmilvusVectorStoreService.searchByVector(VectorQueryRequest.builder().text(今天).topK(20).build());System.out.println(results);if(CollectionUtils.isNotEmpty(results)){ListStringidListresults.stream().map(Document::getId).toList();//根据id删除数据milvusVectorStoreService.deleteById(VectorQueryRequest.builder().idList(idList).build());}}}七、总结本文围绕 Spring AI 对接 Milvus 向量数据库完整走通了从环境搭建到代码落地的全流程主要包含以下几个环节环境准备通过 Docker Compose 安装 Milvus 3.0.x并使用 Attu 作为可视化管理工具方便查看集合与向量数据。依赖与配置引入spring-ai-starter-vector-store-milvus官方 Starter在application.yml中完成连接地址、集合名称、向量维度、索引类型与相似度度量等关键参数配置。请求对象封装通过VectorUpsertRequest与VectorQueryRequest统一承载新增、删除、检索所需的参数便于后续扩展与复用。服务层实现MilvusVectorStoreService基于 Spring AI 的VectorStore抽象实现了向量新增/修改、按 ID 删除以及基于文本的相似性检索并对入参做了必要的校验。测试验证通过单元测试完成「写入 → 检索 → 删除」的闭环验证确认配置与代码均可正常工作。需要特别注意的几点embeddingDimension必须与所用向量化模型如 bge-m3的输出维度保持一致否则写入时会报维度不匹配错误。initializeSchema: true可让 Spring AI 自动创建集合与 Schema生产环境建议改为手动管理避免误建或结构变更。检索时topK、similarityThreshold等参数可按业务场景灵活调整配合metaDataWhere元数据过滤能显著提升召回质量。至此Spring AI Milvus 的基础集成已经完成。后续可以在此基础上继续扩展接入 RAG 问答链路、结合重排序模型优化召回结果或将向量检索能力封装为统一的内部服务供多个业务模块调用。
延伸阅读

更多相关文章

2026/11/4 19:58:54

超重载高抗脉冲风冷却器:如何抵御液压油锤冲击?

在锻压、压铸、铝挤压等重载液压设备中,冷却器不仅要承担散热任务,还要面对频繁动作带来的压力波动。本文面向重载液压设备用户,从液压油锤的成因讲起,说明压力脉冲如何影响冷却器的芯体、油道与接口,并梳理高抗脉冲风…

2026/11/4 19:58:54

我们小区上了智慧社区小程序,半年后业主常打开的是这些

我们小区上了智慧社区小程序,半年后业主常打开的是这些 一、半年后还在被打开的功能,只有三类 半年下来,业主反复打开的入口集中在缴费、报修和通知三类,其余功能多是上线时热闹一阵。 以下是我们小区的观察记录,属行…

2026/11/4 20:44:13

突破万级GFLOPS:CUDA矩阵乘法向量化优化实战

盯着Nsight Compute输出的sm__throughput,看到数字稳稳停在90%以上时,我知道这张卡上纯CUDA向量化的矩阵乘法算是跑通了一个里程碑——单次40964096的FP32 SGEMM,算力突破10000 GFLOPS。从最初300多毫秒的朴素内核,到最后13毫秒出…

2026/11/4 20:44:13

实测Gemini 3做小游戏:全过程记录与协作技巧

我这两天拿Gemini 3折腾了几个小游戏,说实话,成品质量超出我预期,但过程比想象中凶狠多了。所谓凶狠,不是它怼人,而是它写代码、改代码、甚至删代码的风格特别果断,经常一口气给我重构一大片逻辑&#xff0…

2026/11/4 20:44:13

AI应用报错实战速查:三层归因思维与七类故障解决指南

1. AI 应用报错的特殊性:先建立三层归因思维做AI应用开发这几年,我最大的感受是:报错从"单选题"变成了"多选题"。传统Web开发里,报错通常是确定的——数据库连不上就是地址或账号问题,语法错误就是…

2026/11/4 20:44:13

GPT工具调用失败?四段式排查法助你快速定位修复

前两天一个做自动化脚本的朋友跑来问我,说他那边接的“gpt5.6、6”在对话里单独聊天一切正常,但只要一让它调用工具——查个天气、查个数据库、调个内部API——就报错,要么说“function call failed”,要么干脆不发起调用&#xf…

2026/11/4 20:44:13

智能工单系统架构设计与自动化运维实践

1. 项目背景与核心价值 去年帮某大型连锁零售企业做IT运维体系改造时,发现他们每天要处理300工单,客服手动派单平均耗时7分钟,工程师接单后经常出现信息不全需要反复沟通的情况。最头疼的是30%的工单需要人工催办,客户满意度长期徘…

2026/11/4 20:39:13

实验室数字化转型与LIMS系统选型指南

1. 实验室数字化转型的必然趋势 在检验检测行业深耕多年,我亲眼见证了从纸质记录到电子化管理的变革历程。如今,实验室数字化转型已不再是选择题,而是关乎生存的必答题。传统的人工记录方式不仅效率低下,更难以满足日益严格的合规…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑