java调用milvus数据库

复制代码
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();
        }
    }
}
相关推荐
白露与泡影1 分钟前
Redis 的“单线程”与“多线程”:一场关于性能与简洁的权衡
数据库·redis·php
CallFay云起未来19 分钟前
AI客服上线后多久才能回本?从TCO到ROI的完整测算方法
java·大数据·人工智能·架构·文心一言
Sam_Deep_Thinking19 分钟前
什么是CountDownLatch?
java·后端·面试·程序员
小蒜学长25 分钟前
基于SpringBoot和Vue的低卡食品销售系统的设计与实现(代码+数据库+LW)
java·后端·springboot·健康管理·低卡食品销售系统
CRMEB系统商城29 分钟前
前后端技术栈全面换代!CRMEB 多商户(Java)v3.0更新预告
java·开发语言·小程序·php
白起那么早29 分钟前
idea 插件-把数据库的表画出来
数据库·后端·intellij idea
fengkai45451 小时前
十一、MySQL 第 1‑3 章
运维·数据库·mysql
Lancker1 小时前
记一次 Druid 连接 MySQL 报 Communications link failure 的排查过程
数据库·mysql·adb
Sayai1 小时前
Neo4j 内嵌模式(Embedded)实战:Java 嵌入式 vs 服务端部署的写入性能对比与 GC 调优
java·开发语言·性能优化·neo4j·图数据库
木头科技1 小时前
AI 工程化第四篇】Spring AI Agent 线上可观测实战:Token 成本、调用链、工具耗时、RAG 命中率怎么监控
java·人工智能·spring