数据库服务端
本地使用 docker 测试
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d2e75a29937 zilliz/attu:v2.6.3 "docker-entrypoint.s…" 5 days ago Up About an hour 0.0.0.0:3000->3000/tcp, [::]:3000->3000/tcp attu
78fa9d4794db milvusdb/milvus:v2.6.9 "/tini -- milvus run…" 5 days ago Up About an hour (healthy) 0.0.0.0:9091->9091/tcp, [::]:9091->9091/tcp, 0.0.0.0:19530->19530/tcp, [::]:19530->19530/tcp milvus-standalone
39ddccd453ca minio/minio:RELEASE.2024-12-18T13-15-44Z "/usr/bin/docker-ent…" 5 days ago Up About an hour (healthy) 0.0.0.0:9000-9001->9000-9001/tcp, [::]:9000-9001->9000-9001/tcp milvus-minio
09ddcb5fa334 quay.io/coreos/etcd:v3.5.25 "etcd -advertise-cli…" 5 days ago Up About an hour (healthy) 2379-2380/tcp milvus-etcd
测试
maven
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>embed-milvus-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>io.milvus</groupId>
<artifactId>milvus-sdk-java</artifactId>
<version>2.6.13</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.9</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<mainClass>com.example.MilvusExample</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置类
这个测试下来,还是要用 localhost,其他的 docker ip 、镜像全部测试失败。
package com.example.config;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.database.request.DescribeDatabaseReq;
import io.milvus.v2.service.database.response.DescribeDatabaseResp;
import io.milvus.v2.service.database.response.ListDatabasesResp;
public class MilvusConfig {
// private static final String HOST = "172.18.0.4";
private static final String HOST = "localhost";
private static final int PORT = 19530;
private static final String TOKEN = "root:Milvus";
public static MilvusClientV2 createClient() {
System.out.println("========================================");
System.out.println("[MilvusConfig] 开始创建Milvus v2客户端连接");
System.out.println("[MilvusConfig] 连接配置:");
System.out.println(" - URI: http://" + HOST + ":" + PORT);
System.out.println(" - Token: " + TOKEN);
System.out.println("========================================");
try {
String uri = "http://" + HOST + ":" + PORT;
ConnectConfig connectConfig = ConnectConfig.builder()
.uri(uri)
.token(TOKEN)
.build();
System.out.println("[MilvusConfig] 连接参数配置完成,正在创建v2客户端...");
MilvusClientV2 client = new MilvusClientV2(connectConfig);
System.out.println("[MilvusConfig] Milvus v2客户端创建成功");
ListDatabasesResp listDatabasesResp = client.listDatabases();
// 默认数据库
DescribeDatabaseResp descDBResp = client.describeDatabase(DescribeDatabaseReq.builder()
.databaseName("default")
.build());
return client;
} catch (Exception e) {
System.err.println("[MilvusConfig] 创建Milvus v2客户端失败");
System.err.println("[MilvusConfig] 错误类型: " + e.getClass().getName());
System.err.println("[MilvusConfig] 错误信息: " + e.getMessage());
System.err.println("[MilvusConfig] 请检查:");
System.err.println(" 1. Milvus服务是否已启动");
System.err.println(" 2. URI地址是否正确: http://" + HOST + ":" + PORT);
System.err.println(" 3. Token是否正确");
System.err.println(" 4. 网络连接是否正常");
System.err.println(" 5. 防火墙是否阻止连接");
System.err.println("========================================");
throw new RuntimeException("无法连接到Milvus服务: " + e.getMessage(), e);
}
}
}
文本向量化
你可以用大模型,这里简单起见直接让大模型帮我生成
package com.example.model;
import java.util.Arrays;
import java.util.List;
public class TextEmbedding {
private String text;
private List<Float> embedding;
public TextEmbedding(String text, List<Float> embedding) {
this.text = text;
this.embedding = embedding;
}
public String getText() {
return text;
}
public List<Float> getEmbedding() {
return embedding;
}
public static List<TextEmbedding> getSampleEmbeddings() {
return Arrays.asList(
new TextEmbedding("人工智能是计算机科学的一个分支", Arrays.asList(
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f
)),
new TextEmbedding("机器学习是人工智能的核心技术", Arrays.asList(
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f
)),
new TextEmbedding("深度学习是机器学习的一个重要分支", Arrays.asList(
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f
)),
new TextEmbedding("自然语言处理是人工智能的重要应用领域", Arrays.asList(
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f,
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f,
0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f, 0.7890f, -0.8901f,
0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f, 0.5678f, -0.6789f,
0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f, 0.3456f, -0.4567f
)),
new TextEmbedding("向量数据库用于存储和检索高维向量", Arrays.asList(
0.5678f, -0.6789f, 0.7890f, -0.8901f, 0.9012f, -0.0123f, 0.1234f, -0.2345f,
0.3456f, -0.4567f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f,
0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f,
0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f, 0.0123f, -0.1234f,
0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f, 0.8901f, -0.9012f,
0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f, 0.6789f, -0.7890f,
0.8901f, -0.9012f, 0.0123f, -0.1234f, 0.2345f, -0.3456f, 0.4567f, -0.5678f
))
);
}
}
测试类
package com.example;
import com.example.config.MilvusConfig;
import com.example.model.TextEmbedding;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.DataType;
import io.milvus.v2.common.IndexParam;
import io.milvus.v2.service.collection.request.*;
import io.milvus.v2.service.collection.response.*;
import io.milvus.v2.service.index.request.CreateIndexReq;
import io.milvus.v2.service.vector.request.*;
import io.milvus.v2.service.vector.request.data.FloatVec;
import io.milvus.v2.service.vector.response.*;
import java.util.*;
public class MilvusExample {
private static final String COLLECTION_NAME = "text_collection";
private static final int DIMENSION = 360;
private static final int MAX_RETRY_TIMES = 3;
private static final long RETRY_INTERVAL_MS = 2000;
public static void main(String[] args) {
System.out.println("========================================");
System.out.println("Milvus示例程序开始执行");
System.out.println("========================================");
MilvusClientV2 milvusClient = MilvusConfig.createClient();
System.out.println("成功连接到Milvus服务");
try {
checkMilvusHealth(milvusClient);
dropCollectionIfExists(milvusClient);
createCollection(milvusClient);
createIndex(milvusClient);
loadCollection(milvusClient);
insertData(milvusClient);
searchData(milvusClient);
System.out.println("========================================");
System.out.println("Milvus示例程序执行完成");
System.out.println("========================================");
} catch (Exception e) {
System.err.println("程序执行过程中发生异常: " + e.getMessage());
e.printStackTrace();
} finally {
System.out.println("正在关闭Milvus客户端连接...");
milvusClient.close();
System.out.println("Milvus客户端连接已关闭");
}
}
private static void checkMilvusHealth(MilvusClientV2 client) {
System.out.println("\n[checkMilvusHealth] 开始检查Milvus服务健康状态...");
int retryCount = 0;
while (retryCount < MAX_RETRY_TIMES) {
try {
ListCollectionsResp resp = client.listCollections();
System.out.println("[checkMilvusHealth] Milvus服务健康检查通过");
System.out.println("[checkMilvusHealth] 当前collection数量: " + resp.getCollectionNames().size());
System.out.println("[checkMilvusHealth] 方法执行完成");
return;
} catch (Exception e) {
System.err.println("[checkMilvusHealth] 健康检查失败 (尝试 " + (retryCount + 1) + "/" + MAX_RETRY_TIMES + "): " + e.getMessage());
}
retryCount++;
if (retryCount < MAX_RETRY_TIMES) {
System.out.println("[checkMilvusHealth] 等待 " + RETRY_INTERVAL_MS + "ms 后重试...");
try {
Thread.sleep(RETRY_INTERVAL_MS);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
throw new RuntimeException("健康检查被中断", ie);
}
}
}
throw new RuntimeException("Milvus服务健康检查失败,请检查服务状态");
}
private static void dropCollectionIfExists(MilvusClientV2 client) {
System.out.println("\n[dropCollectionIfExists] 开始检查并删除已存在的collection...");
try {
ListCollectionsResp resp = client.listCollections();
if (resp.getCollectionNames().contains(COLLECTION_NAME)) {
System.out.println("[dropCollectionIfExists] 发现已存在的collection: " + COLLECTION_NAME);
DropCollectionReq dropReq = DropCollectionReq.builder()
.collectionName(COLLECTION_NAME)
.build();
client.dropCollection(dropReq);
System.out.println("[dropCollectionIfExists] 成功删除collection: " + COLLECTION_NAME);
} else {
System.out.println("[dropCollectionIfExists] collection不存在,无需删除");
}
} catch (Exception e) {
System.err.println("[dropCollectionIfExists] 删除collection时发生异常: " + e.getMessage());
e.printStackTrace();
throw e;
}
System.out.println("[dropCollectionIfExists] 方法执行完成");
}
private static void createCollection(MilvusClientV2 client) {
System.out.println("\n[createCollection] 开始创建collection...");
try {
CreateCollectionReq.CollectionSchema schema = client.createSchema();
schema.addField(AddFieldReq.builder()
.fieldName("id")
.dataType(DataType.Int64)
.isPrimaryKey(true)
.autoID(true)
.build());
schema.addField(AddFieldReq.builder()
.fieldName("text")
.dataType(DataType.VarChar)
.maxLength(255)
.build());
schema.addField(AddFieldReq.builder()
.fieldName("embedding")
.dataType(DataType.FloatVector)
.dimension(DIMENSION)
.build());
System.out.println("[createCollection] 字段schema定义完成,包含3个字段: id, text, embedding");
CreateCollectionReq request = CreateCollectionReq.builder()
.collectionName(COLLECTION_NAME)
.collectionSchema(schema)
.build();
client.createCollection(request);
System.out.println("[createCollection] 成功创建collection: " + COLLECTION_NAME);
} catch (Exception e) {
System.err.println("[createCollection] 创建collection时发生异常: " + e.getMessage());
e.printStackTrace();
throw e;
}
System.out.println("[createCollection] 方法执行完成");
}
private static void createIndex(MilvusClientV2 client) {
System.out.println("\n[createIndex] 开始创建索引...");
try {
IndexParam indexParam = IndexParam.builder()
.fieldName("embedding")
.indexType(IndexParam.IndexType.IVF_FLAT)
.metricType(IndexParam.MetricType.L2)
.build();
CreateIndexReq request = CreateIndexReq.builder()
.collectionName(COLLECTION_NAME)
.indexParams(Collections.singletonList(indexParam))
.build();
System.out.println("[createIndex] 索引类型: IVF_FLAT, 度量类型: L2");
client.createIndex(request);
System.out.println("[createIndex] 成功创建索引");
} catch (Exception e) {
System.err.println("[createIndex] 创建索引时发生异常: " + e.getMessage());
e.printStackTrace();
throw e;
}
System.out.println("[createIndex] 方法执行完成");
}
private static void loadCollection(MilvusClientV2 client) {
System.out.println("\n[loadCollection] 开始加载collection到内存...");
try {
LoadCollectionReq request = LoadCollectionReq.builder()
.collectionName(COLLECTION_NAME)
.build();
client.loadCollection(request);
System.out.println("[loadCollection] 成功加载collection到内存");
} catch (Exception e) {
System.err.println("[loadCollection] 加载collection时发生异常: " + e.getMessage());
e.printStackTrace();
throw e;
}
System.out.println("[loadCollection] 方法执行完成");
}
private static void insertData(MilvusClientV2 client) {
System.out.println("\n[insertData] 开始插入数据...");
try {
List<TextEmbedding> embeddings = TextEmbedding.getSampleEmbeddings();
System.out.println("[insertData] 准备插入 " + embeddings.size() + " 条文本向量数据");
Gson gson = new Gson();
List<JsonObject> data = new ArrayList<>();
for (int i = 0; i < embeddings.size(); i++) {
TextEmbedding embedding = embeddings.get(i);
JsonObject json = new JsonObject();
json.addProperty("text", embedding.getText());
json.add("embedding", gson.toJsonTree(embedding.getEmbedding()));
data.add(json);
System.out.println("[insertData] 准备第 " + (i + 1) + " 条数据: " + embedding.getText());
}
InsertReq request = InsertReq.builder()
.collectionName(COLLECTION_NAME)
.data(data)
.build();
System.out.println("[insertData] 正在向Milvus插入数据...");
client.insert(request);
System.out.println("[insertData] 成功插入 " + embeddings.size() + " 条数据");
System.out.println("[insertData] 等待索引构建完成...");
try {
Thread.sleep(3000);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
System.err.println("[insertData] 等待被中断");
}
System.out.println("[insertData] 索引构建等待完成");
} catch (Exception e) {
System.err.println("[insertData] 插入数据时发生异常: " + e.getMessage());
e.printStackTrace();
throw e;
}
System.out.println("[insertData] 方法执行完成");
}
private static void searchData(MilvusClientV2 client) {
System.out.println("\n[searchData] 开始执行向量搜索...");
try {
List<TextEmbedding> embeddings = TextEmbedding.getSampleEmbeddings();
List<Float> queryVector = embeddings.get(0).getEmbedding();
String queryText = embeddings.get(0).getText();
System.out.println("[searchData] 查询文本: " + queryText);
System.out.println("[searchData] 查询向量维度: " + queryVector.size());
System.out.println("[searchData] 返回最相似的 TopK: 3");
float[] floatArray = new float[queryVector.size()];
for (int i = 0; i < queryVector.size(); i++) {
floatArray[i] = queryVector.get(i);
}
FloatVec floatVec = new FloatVec(floatArray);
SearchReq request = SearchReq.builder()
.collectionName(COLLECTION_NAME)
.data(Collections.singletonList(floatVec))
.annsField("embedding")
.topK(3)
.outputFields(Arrays.asList("text"))
.build();
System.out.println("[searchData] 正在执行搜索...");
SearchResp response = client.search(request);
System.out.println("[searchData] 搜索成功,开始解析结果...");
System.out.println("\n========== 搜索结果 ==========");
List<List<SearchResp.SearchResult>> searchResults = response.getSearchResults();
for (List<SearchResp.SearchResult> results : searchResults) {
System.out.println("TopK results:");
for (int i = 0; i < results.size(); i++) {
SearchResp.SearchResult result = results.get(i);
float score = result.getScore();
Map<String, Object> fields = result.getEntity();
String text = (String) fields.get("text");
System.out.println("排名 " + (i + 1) + " - 相似度: " + score + ", 文本: " + text);
}
}
System.out.println("================================\n");
} catch (Exception e) {
System.err.println("[searchData] 搜索时发生异常: " + e.getMessage());
e.printStackTrace();
throw e;
}
System.out.println("[searchData] 方法执行完成");
}
}
测试日志
========================================
Milvus示例程序开始执行
========================================
========================================
[MilvusConfig] 开始创建Milvus v2客户端连接
[MilvusConfig] 连接配置:
- URI: http://localhost:19530
- Token: root:Milvus
========================================
[MilvusConfig] 连接参数配置完成,正在创建v2客户端...
[MilvusConfig] Milvus v2客户端创建成功
成功连接到Milvus服务
[checkMilvusHealth] 开始检查Milvus服务健康状态...
[checkMilvusHealth] Milvus服务健康检查通过
[checkMilvusHealth] 当前collection数量: 2
[checkMilvusHealth] 方法执行完成
[dropCollectionIfExists] 开始检查并删除已存在的collection...
[dropCollectionIfExists] 发现已存在的collection: text_collection
[dropCollectionIfExists] 成功删除collection: text_collection
[dropCollectionIfExists] 方法执行完成
[createCollection] 开始创建collection...
[createCollection] 字段schema定义完成,包含3个字段: id, text, embedding
[createCollection] 成功创建collection: text_collection
[createCollection] 方法执行完成
[createIndex] 开始创建索引...
[createIndex] 索引类型: IVF_FLAT, 度量类型: L2
[createIndex] 成功创建索引
[createIndex] 方法执行完成
[loadCollection] 开始加载collection到内存...
[loadCollection] 成功加载collection到内存
[loadCollection] 方法执行完成
[insertData] 开始插入数据...
[insertData] 准备插入 5 条文本向量数据
[insertData] 准备第 1 条数据: 人工智能是计算机科学的一个分支
[insertData] 准备第 2 条数据: 机器学习是人工智能的核心技术
[insertData] 准备第 3 条数据: 深度学习是机器学习的一个重要分支
[insertData] 准备第 4 条数据: 自然语言处理是人工智能的重要应用领域
[insertData] 准备第 5 条数据: 向量数据库用于存储和检索高维向量
[insertData] 正在向Milvus插入数据...
[insertData] 成功插入 5 条数据
[insertData] 等待索引构建完成...
[insertData] 索引构建等待完成
[insertData] 方法执行完成
[searchData] 开始执行向量搜索...
[searchData] 查询文本: 人工智能是计算机科学的一个分支
[searchData] 查询向量维度: 360
[searchData] 返回最相似的 TopK: 3
[searchData] 正在执行搜索...
[searchData] 搜索成功,开始解析结果...
========== 搜索结果 ==========
TopK results:
排名 1 - 相似度: 0.0, 文本: 人工智能是计算机科学的一个分支
排名 2 - 相似度: 31.920082, 文本: 机器学习是人工智能的核心技术
排名 3 - 相似度: 62.22575, 文本: 深度学习是机器学习的一个重要分支
================================
[searchData] 方法执行完成
========================================
Milvus示例程序执行完成
========================================
正在关闭Milvus客户端连接...
Milvus客户端连接已关闭
补充:我们使用的是 L2(欧几里得)距离 作为度量标准,所以 0.0 代表完全相似。
参考资料
https://milvus.io/docs/zh/glossary.md
