Milvus 向量数据库:原理 + 使用 + Java 代码示例
·
一、Milvus 是什么?(通俗版)
1.1 一句话定义
Milvus 是一款开源、高性能、专门存向量的数据库。
它只干一件事:
存储海量向量 → 快速查询最相似的向量
1.2 向量是什么?
图片、文字、音频、视频 → 经过 AI 模型 → 变成一串数字(比如 512 维、1024 维)
[0.12, 0.45, 0.67, ..., 0.89]
这串数字就叫向量(Embedding)
1.3 Milvus 能干嘛?
- 图片检索(以图搜图)
- 文本相似匹配(智能问答)
- 推荐系统
- 人脸识别
- 大模型 RAG 知识库(最常用!)
现在最火的 AI 知识库 RAG,90% 用 Milvus 做向量存储!
二、Milvus 核心原理(初学者必懂)
2.1 核心能力
Milvus 只做两件事:
- 插入向量(存)
- 搜索相似向量(查)
2.2 为什么不用 MySQL?
- MySQL 不擅长高维向量计算
- 100万条数据 MySQL 查要几秒
- Milvus 查只要 几毫秒
2.3 Milvus 核心结构
-
Collection(集合)
相当于 MySQL 的 表 -
Field(字段)
普通字段 + 向量字段 -
Vector(向量)
必须指定维度:128/512/768/1024 -
Index(索引)
让搜索变快的关键
常用:IVF_FLAT、IVF_SQ8、HNSW -
Partition(分区)
数据分片,加速查询
三、Milvus 工作流程(超简单)
1. 创建集合(指定维度)
2. 创建索引
3. 插入向量数据
4. 输入一个向量 → 搜索 TOP-K 最相似结果
四、Java 连接 Milvus 实战(完整可运行)
4.1 环境准备
- 安装 Milvus(Docker 一行命令)
docker run -d --name milvus -p 19530:19530 milvusdb/milvus:v2.3.0
- Java 项目引入依赖(Maven)
<dependency>
<groupId>io.milvus</groupId>
<artifactId>milvus-sdk-java</artifactId>
<version>2.3.0</version>
</dependency>
五、Java 完整代码示例(初学者直接跑)
5.1 连接 Milvus
import io.milvus.client.MilvusServiceClient;
import io.milvus.param.ConnectParam;
public class MilvusConnect {
public static MilvusServiceClient getClient() {
ConnectParam connectParam = ConnectParam.newBuilder()
.withHost("localhost")
.withPort(19530)
.build();
return new MilvusServiceClient(connectParam);
}
}
5.2 创建集合(表)
public void createCollection() {
MilvusServiceClient client = MilvusConnect.getClient();
// 创建集合:test_collection
CreateCollectionParam param = CreateCollectionParam.newBuilder()
.withCollectionName("test_collection")
.withDescription("测试集合")
.addField(FieldType.newBuilder()
.withName("id")
.withDataType(DataType.Int64)
.withPrimaryKey(true)
.withAutoID(true)
.build())
.addField(FieldType.newBuilder()
.withName("vector")
.withDataType(DataType.FloatVector)
.withDimension(512) // 向量维度 512
.build())
.build();
client.createCollection(param);
System.out.println("集合创建成功");
}
5.3 创建索引(必须建,不然搜索极慢)
public void createIndex() {
MilvusServiceClient client = MilvusConnect.getClient();
IndexParam indexParam = IndexParam.newBuilder()
.withCollectionName("test_collection")
.withFieldName("vector")
.withIndexType(IndexType.HNSW) // 最快的索引
.withMetricType(MetricType.L2) // 欧式距离
.build();
client.createIndex(indexParam);
System.out.println("索引创建成功");
}
5.4 插入向量数据
public void insert() {
MilvusServiceClient client = MilvusConnect.getClient();
// 构造 512 维向量(模拟 AI 生成的向量)
List<Float> vector = new ArrayList<>();
for (int i = 0; i < 512; i++) {
vector.add((float) Math.random());
}
List<List<Float>> vectors = new ArrayList<>();
vectors.add(vector);
InsertParam insertParam = InsertParam.newBuilder()
.withCollectionName("test_collection")
.addVectorField("vector", vectors)
.build();
client.insert(insertParam);
System.out.println("向量插入成功");
}
5.5 向量搜索(最核心功能)
public void search() {
MilvusServiceClient client = MilvusConnect.getClient();
// 构造待搜索向量
List<Float> queryVector = new ArrayList<>();
for (int i = 0; i < 512; i++) {
queryVector.add((float) Math.random());
}
SearchParam searchParam = SearchParam.newBuilder()
.withCollectionName("test_collection")
.withTopK(5) // 返回 TOP5 最相似
.withVectorFieldName("vector")
.withVectors(Collections.singletonList(queryVector))
.withMetricType(MetricType.L2)
.build();
SearchResponse response = client.search(searchParam);
System.out.println("搜索结果:" + response);
}
六、Milvus 核心概念速查表(初学者必背)
| 概念 | 说明 |
|---|---|
| Collection | 表 |
| Vector | 向量(数字数组) |
| Dimension | 向量维度(512/768/1024) |
| Index | 索引(加速搜索) |
| HNSW | 高性能索引(推荐) |
| L2 | 欧式距离(相似度计算) |
| TOP-K | 返回最相似的 K 条 |
七、最简单学习路线(3 天学会)
- 跑通 Java 连接代码
- 学会创建集合 + 索引
- 学会插入向量
- 学会搜索向量
- 结合大模型做 RAG 知识库(终极目标)
八、我可以继续帮你
你想要我继续提供哪些内容?(任选)
- SpringBoot 整合 Milvus 完整项目
- RAG 知识库 Java 实战代码
- Milvus 可视化管理工具 Attu 使用
- Milvus 生产部署优化方案
你直接告诉我,我马上给你写!
更多推荐
所有评论(0)