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
相关推荐
睡不醒男孩0308233 小时前
第二篇:深入探索开源数据库高可用:构建基于CLup的PostgreSQL生产级高可用与读写分离架构xieliyu.5 小时前
Java算法精讲:双指针(三)明夜之约5 小时前
Spring Boot 自动装配源码Leaton Lee5 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程Micro麦可乐5 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)Jinkxs5 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用辣机小司5 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】码农阿豪5 小时前
从零到一:Spring Boot快速接入金仓数据库实战鼎讯信通6 小时前
风电光缆运维提质增效:G-4000A 光缆故障追踪仪破解风场巡检难题三十..6 小时前
MySQL 从入门到高可用架构实战精要