package org.dromara.langchain4j.config;
import io.milvus.client.MilvusServiceClient;
import io.milvus.grpc.DataType;
import io.milvus.grpc.MutationResult;
import io.milvus.grpc.SearchResults;
import io.milvus.param.*;
import io.milvus.param.collection.CreateCollectionParam;
import io.milvus.param.collection.FieldType;
import io.milvus.param.collection.LoadCollectionParam;
import io.milvus.param.dml.InsertParam;
import io.milvus.param.dml.SearchParam;
import io.milvus.param.index.CreateIndexParam;
import io.milvus.response.QueryResultsWrapper;
import io.milvus.response.SearchResultsWrapper;
import java.util.*;
public class MilvusJavaDemo {
// 1. 连接Milvus服务器
private static MilvusServiceClient connectMilvus() {
String uri = "http://localhost:19530"; // Milvus服务地址
ConnectParam connectParam = ConnectParam.newBuilder()
.withUri(uri)
.build();
return new MilvusServiceClient(connectParam);
}
public static void main(String[] args) {
MilvusServiceClient client = connectMilvus();
final String COLLECTION_NAME = "book_collection";
final int VECTOR_DIM = 768; // 向量维度
try {
// 4. 加载集合到内存(搜索前必须步骤)
R<RpcStatus> loadRes = client.loadCollection(LoadCollectionParam.newBuilder()
.withCollectionName(COLLECTION_NAME)
.build());
// 5. 插入数据(增 - Create)
Random ran = new Random();
// 6. 执行向量相似性搜索(查 - Read/Query)
// 准备一个随机向量作为查询目标
List<Float> targetVector = new ArrayList<>();
for (int i = 0; i < VECTOR_DIM; i++) {
targetVector.add(ran.nextFloat());
}
List<List<Float>> searchVectors = Arrays.asList(targetVector);
SearchParam searchParam = SearchParam.newBuilder()
.withCollectionName(COLLECTION_NAME)
.withVectorFieldName("book_intro")
.withVectors(searchVectors)
.withTopK(2) // 返回最相似的2条结果
.withMetricType(MetricType.L2)
.withParams("{\"nprobe\":10}") // 搜索参数
.addOutField("word_count") // 指定返回的标量字段
.build();
R<SearchResults> searchRes = client.search(searchParam);
if (searchRes.getStatus() == R.Status.Success.getCode()) {
SearchResultsWrapper wrapper = new SearchResultsWrapper(searchRes.getData().getResults());
System.out.println("\n搜索完成,结果如下:");
for (QueryResultsWrapper.RowRecord results : wrapper.getRowRecords()) {
// System.out.printf("距离: %f, 数据: %s%n", results.getFieldValues(), record.getFields());
Map<String, Object> fieldValues = results.getFieldValues();
for (Map.Entry<String, Object> entry : fieldValues.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
// 7. 删除数据(删 - Delete)
// 构建删除表达式,例如删除 word_count < 9000 的记录
// String deleteExpr = "word_count < 9000";
// DeleteParam deleteParam = DeleteParam.newBuilder()
// .withCollectionName(COLLECTION_NAME)
// .withExpr(deleteExpr)
// .build();
// R<MutationResult> deleteRes = client.delete(deleteParam);
// long deleteCount = deleteRes.getData().getDeleteCnt();
// System.out.println("\n删除操作完成,删除了 " + deleteCount + " 条记录。");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 8. 可选:删除集合(清理环境)
// R<RpcStatus> dropRes = client.dropCollection(DropCollectionParam.newBuilder()
// .withCollectionName(COLLECTION_NAME)
// .build());
// System.out.println("集合已删除。");
// 关闭客户端连接
client.close();
}
}
}
java调用milvus数据库
ShadowSmartMicros2025-12-20 17:30
相关推荐
Pniubi6 小时前
HashMap的扩容和树化边界Mikko76 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩知了学历孙老师6 小时前
小自考的校考和统考,出题方和难度差在哪Java爱好狂.6 小时前
Java初学者如何一周速通SpringBoot!秋饼7 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由zyseo88 小时前
谷歌SEO 准首页词挖掘脚本:找出排在第 8-20 名的隐藏流量福兮说9 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值xiaogai_gai10 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单紧跟先前的步伐10 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本数据工匠老o10 小时前
异构数据库DDL同步:260条链路的结构变更自动适配方案