Spring AI 系列(二):Milvus 操作一篇就够了——CLI 命令行 + Java SDK 实战全攻略

发布时间:2026/7/29 17:30:09
Spring AI 系列(二):Milvus 操作一篇就够了——CLI 命令行 + Java SDK 实战全攻略 Spring AI 系列二Milvus 操作一篇就够了——CLI 命令行 Java SDK 实战全攻略本文介绍 Milvus 的两种操作方式通过 Milvus CLI 命令行工具进行操作以及通过 Java SDK 进行编程操作。1. Milvus Cli 操作Milvus中提供了Milvus Cli命令行方式对Milvus进行操作Milvus Cli 基于Python要求python3.8.5以上可以使用pip install milvus-cli进行安装如下是在windows中基于anconda默认已经安装安装python3.9环境并在该环境中安装 milvus-cli打开cmd后执行如下命令# 创建一个名为python_milvus的环境指定Python版本是3.9conda create--namepython_milvuspython3.9.23# 安装好后使用activate激活该环境activate python_milvus# 安装milvus-clipipinstallmilvus-cli# 安装 readline在window中使用 milvus_cli时需要该模块pipinstallpyreadline3#如果不行使用该环境可以执行如下删除该环境conda remove--namepython_milvus--all下面进入到 milvus-cli 中连接Milvus并进行基本操作。1.1 连接Milvus# 进入 milvus 客户端milvus_cli# 连接milvus_cli ,默认用户名和密码为root:Milvusmilvus_cliconnect-urihttp://node2:19530-troot:Milvus Connect Milvus successfully. Error occurred!list index out of range解释-uri:连接Milvus的uri 名称默认为 “http://127.0.0.1:19530”-t:连接Milvus的令牌指定用户名和密码;Error occurred可能是个bug先忽略。1.2 数据库操作创建、列出、使用、删除# 创建数据库milvus_clicreate database-dbtestdb Create database testdb successfully!#列出数据库milvus_clilist databases ---------|db_name|---------|default||testdb|---------#使用数据库milvus_cliuse database-dbtestdb Using database testdb successfully!#删除数据库milvus_clidelete database-dbtestdb Drop database testdb successfully!1.3 用户操作创建、列出、删除# 创建用户-u 用户名-p 密码milvus_clicreate user-uzs-p123456Create user successfully![root,zs]#列出所有用户milvus_clilistusers[root,zs]#删除用户-u 指定删除的用户milvus_clidelete user-uzs Warning!You are trying to delete the userinmilvus. This action cannot be undone!Do you want to continue?[y/N]: y Delete user zs successfully![root]通过Milvus Cli 操作Collection目前存在问题我们后续通过Java SDK来演示Collection操作。2. Milvus Java API 操作Java API 操作Milvus 需要JDK8版本以上maven中需要导入如下依赖dependencygroupIdio.milvus/groupIdartifactIdmilvus-sdk-java/artifactIdversion2.6.0/version/dependency这里以Java操作Milvus中的Collection为例介绍Milvus Java API使用。完整的 Java操作代码如下packageorg.example;importcom.google.gson.Gson;importcom.google.gson.JsonObject;importio.milvus.param.collection.FlushParam;importio.milvus.v2.client.ConnectConfig;importio.milvus.v2.client.MilvusClientV2;importio.milvus.v2.common.DataType;importio.milvus.v2.common.IndexParam;importio.milvus.v2.service.collection.request.*;importio.milvus.v2.service.collection.response.DescribeCollectionResp;importio.milvus.v2.service.utility.request.FlushReq;importio.milvus.v2.service.vector.request.DeleteReq;importio.milvus.v2.service.vector.request.GetReq;importio.milvus.v2.service.vector.request.InsertReq;importio.milvus.v2.service.vector.request.SearchReq;importio.milvus.v2.service.vector.response.DeleteResp;importio.milvus.v2.service.vector.response.GetResp;importio.milvus.v2.service.vector.response.InsertResp;importio.milvus.v2.service.vector.response.SearchResp;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;publicclassTestMilvusCollection{//可能更换成自己的主机staticStringCLUSTER_ENDPOINThttp://node2:19530;staticStringTOKENroot:Milvus;publicstaticvoidmain(String[]args){//1. 连接到 MilvusConnectConfigconnectConfigConnectConfig.builder().uri(CLUSTER_ENDPOINT).token(TOKEN).build();MilvusClientV2clientnewMilvusClientV2(connectConfig);StringcollectionNametestCollection;//1. 创建一个集合createCollection(client,collectionName);//2. 列出集合ListStringcollectionNamesclient.listCollections().getCollectionNames();System.out.println(Collections: collectionNames);//3.插入数据insertDataToCollection(client,collectionName);//4.查询数据GetRespgetRespclient.get(GetReq.builder().collectionName(collectionName)// 查询集合名称.ids(List.of(0,1,2))// 查询 id 为 0 和 1 的数据.outputFields(List.of(id,color))// 查询 id 和 color 字段.build());getResp.getResults.forEach(result-{System.out.println(查询结果result);});//4.根据主键删除数据DeleteRespdeleteclient.delete(DeleteReq.builder().collectionName(collectionName)// 删除集合名称.ids(List.of(0,1))// 删除 id 为 0 和 1 的数据.build());System.out.println(删除数据反馈delete);//5.删除集合// client.dropCollection(DropCollectionReq.builder()// .collectionName(collectionName)// .build());// System.out.println(删除集合collectionName);}privatestaticvoidinsertDataToCollection(MilvusClientV2client,StringcollectionName){//3.1 准备 json 数据GsongsonnewGson();ListJsonObjectdataArrays.asList(gson.fromJson({\id\: 0, \vector\: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \color\: \pink_8683\},JsonObject.class),gson.fromJson({\id\: 1, \vector\: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \color\: \red_7025\},JsonObject.class),gson.fromJson({\id\: 2, \vector\: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \color\: \orange_6781\},JsonObject.class),gson.fromJson({\id\: 3, \vector\: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \color\: \pink_9298\},JsonObject.class),gson.fromJson({\id\: 4, \vector\: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \color\: \red_4794\},JsonObject.class),gson.fromJson({\id\: 5, \vector\: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \color\: \yellow_4222\},JsonObject.class),gson.fromJson({\id\: 6, \vector\: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \color\: \red_9392\},JsonObject.class),gson.fromJson({\id\: 7, \vector\: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \color\: \grey_8510\},JsonObject.class),gson.fromJson({\id\: 8, \vector\: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \color\: \white_9381\},JsonObject.class),gson.fromJson({\id\: 9, \vector\: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \color\: \purple_4976\},JsonObject.class));//3.2 插入数据InsertRespinsertRespclient.insert(InsertReq.builder().collectionName(collectionName).data(data).build());//3.3 刷新数据 否则查询不到数据FlushReqflushReqFlushReq.builder().collectionNames(Arrays.asList(collectionName)).build();client.flush(flushReq);System.out.println(插入数据反馈insertResp);}publicstaticvoidcreateCollection(MilvusClientV2client,StringcollectionName){//1.1 先创建集合 schemaCreateCollectionReq.CollectionSchemaschemaMilvusClientV2.CreateSchema().addField(AddFieldReq.builder().fieldName(id).dataType(DataType.Int64).isPrimaryKey(true).autoID(false).build()).addField(AddFieldReq.builder().fieldName(vector).dataType(DataType.FloatVector).dimension(5).build()).addField(AddFieldReq.builder().fieldName(color).dataType(DataType.VarChar).maxLength(512).build());//1.2 如果要创建索引必须为 vector 列创建索引否则无法创建表// 建议对vector列创建索引方便高效向量搜索ListIndexParamindexParamsnewArrayList();IndexParamvectorIndexParam.builder().fieldName(vector).indexType(IndexParam.IndexType.IVF_FLAT)// 向量索引类型.metricType(IndexParam.MetricType.COSINE)// 余弦相似度.build();indexParams.add(vector);//1.3 创建集合if(client.hasCollection(HasCollectionReq.builder().collectionName(collectionName).build())){System.out.println(Collection already exists: collectionName);return;}client.createCollection(CreateCollectionReq.builder().collectionName(collectionName)// 集合名称.collectionSchema(schema)// 集合 schema.indexParams(indexParams)// 索引参数.build());System.out.println(Collection created: collectionName);}}以上代码注意如下几点创建Collection时需要指定Schema如果表中有vector字段必须设置索引加快查询速度。向Collection中插入数据后需要执行flush否则查询不到数据。在代码运行过程中可以结合Attu工具查看Milvus中的Collection及其内容。