【开源向量数据库】Milvus简介
- 其他
- 2025-09-05 11:27:03

Milvus 是一个开源、高性能、可扩展的向量数据库,专门用于存储和检索高维向量数据。它支持近似最近邻搜索(ANN),适用于图像检索、自然语言处理(NLP)、推荐系统、异常检测等 AI 应用场景。
官网: milvus.io/
1. Milvus 的特点 (1)高性能 支持数十亿级向量数据,查询速度快。使用 近似最近邻(ANN)索引算法,如 HNSW、IVF-FLAT、IVF-PQ、SCANN 等。 (2)分布式架构 可以横向扩展(scalability),适用于大规模数据集。支持云端部署,可结合 Kubernetes 进行管理。 (3)多种索引支持 HNSW(Hierarchical Navigable Small World):高效、高准确度的图索引。IVF-FLAT(Inverted File Index + Flat Search):适用于大规模数据检索。IVF-PQ(Inverted File Index + Product Quantization):节省存储,提高检索效率。 (4)多种数据类型 支持不同类型的向量(浮点数、二进制),同时可存储元数据(metadata),比如文本、标签等。支持 JSON 存储,可以存放结构化数据。 (5)多种 API 语言支持 PythonGoJavaC++ (6)与 AI 生态兼容 可与 PyTorch、TensorFlow、OpenAI Embeddings、Hugging Face 集成,用于 NLP、计算机视觉等任务。支持 Kubernetes 部署,适合云原生应用。
2. Milvus 架构
Milvus 采用 分布式架构,主要组件包括:
组件作用Proxy处理客户端请求,分发查询QueryNode负责向量搜索IndexNode负责构建索引DataNode负责存储和管理数据MetaStore存储元数据Coordinator(协调器)负责管理集群3. 安装 Milvus
Milvus 可以使用 Docker 进行安装:
(1)Linux下的安装方法 1)安装 Docker & Docker Compose # 安装 Docker sudo apt update sudo apt install -y docker.io # 安装 Docker Compose sudo apt install -y docker-compose 2)拉取 Milvus git clone github /milvus-io/milvus.git cd milvus 3)启动 Milvus docker-compose up -d (2)Windows 下的安装方法在 Windows 上安装 Milvus 主要有两种方式:
使用 Docker 安装(推荐)使用 WSL(Windows Subsystem for Linux)安装 方法 1:使用 Docker 安装 Milvus(推荐) 1.1 安装 Docker 下载并安装 Docker Desktop for Windows启用 WSL 2 后端 打开 Docker Desktop 设置进入 General 选项卡,勾选 Use the WSL 2 based engine 启用 Windows 容器支持(可选,但建议启用) 1.2 下载 Milvus git clone github /milvus-io/milvus.git cd milvus 1.3 启动 Milvus docker-compose up -d 该命令会下载 Milvus 并启动默认的服务,端口 19530 可用于 API 访问。方法 2:使用 WSL 安装 Milvus 2.1 启用 WSL wsl --install 确保 WSL 版本为 2: wsl --set-default-version 2 安装 Ubuntu: wsl --install -d Ubuntu 2.2 安装 Docker sudo apt update // 更新软件包列表 sudo apt install -y docker.io // 安装 Docker sudo apt install docker-compose -y // 安装 docker-compose 2.3 下载并启动 Milvus cd ~ // 尝试在 WSL 内部的 Linux 文件系统(如 ~/)中克隆 git clone github /milvus-io/milvus.git cd milvus docker-compose up -d
4. Milvus 管理工具 3.1 Attu Attu 是官方推荐的 Milvus 可视化管理工具:安装 Attu docker run -d --name attu -p 3000:3000 zilliz/attu 访问 http://localhost:3000
5. 默认接口、用户名、密码 配置项默认值接口19530用户名无默认用户名密码无默认密码
注意:默认情况下,Milvus 没有身份验证。若需安全访问,可以通过代理层或内部网权限控制实现认证。
6. 使用 Python 操作 Milvus 安装 pymilvus pip install pymilvus 创建 Milvus 连接 from pymilvus import connections connections.connect(host="localhost", port="19530") 创建 Collection from pymilvus import Collection, CollectionSchema, FieldSchema, DataType # 定义 Collection 结构 fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields, description="Example Collection") # 创建 Collection collection = Collection(name="example_collection", schema=schema) 插入数据 import numpy as np # 生成 1000 个 128 维的随机向量 num_vectors = 1000 dim = 128 vectors = np.random.rand(num_vectors, dim).tolist() ids = list(range(num_vectors)) # 插入数据 collection.insert([ids, vectors]) 创建索引 index_params = { "metric_type": "L2", # 余弦相似度/欧式距离 "index_type": "IVF_FLAT", "params": {"nlist": 128} } collection.create_index(field_name="vector", index_params=index_params) 查询相似向量 # 生成查询向量 query_vector = np.random.rand(1, 128).tolist() # 进行相似性搜索 collection.load() result = collection.search(query_vector, "vector", param={"nprobe": 10}, limit=5) # 打印结果 for hits in result: for hit in hits: print(f"ID: {hit.id}, Distance: {hit.distance}")
7. 使用 Java 操作 Milvus 7.1 安装 Java 依赖
在 pom.xml 添加:
<dependency> <groupId>io.milvus</groupId> <artifactId>milvus-sdk-java</artifactId> <version>2.3.2</version> </dependency> 7.2 连接 Milvus import io.milvus.client.*; import io.milvus.param.ConnectParam; public class MilvusExample { public static void main(String[] args) { MilvusServiceClient client = new MilvusServiceClient( ConnectParam.newBuilder() .withHost("localhost") .withPort(19530) .build() ); System.out.println("Connected to Milvus"); } } 7.3 创建 Collection import io.milvus.param.collection.*; import io.milvus.grpc.DataType; import java.util.Arrays; public class CreateCollection { public static void main(String[] args) { MilvusServiceClient client = new MilvusServiceClient( ConnectParam.newBuilder().withHost("localhost").withPort(19530).build() ); FieldType idField = FieldType.newBuilder() .withName("id").withDataType(DataType.Int64) .withPrimaryKey(true).build(); FieldType vectorField = FieldType.newBuilder() .withName("vector").withDataType(DataType.FloatVector) .withDimension(128).build(); CollectionMapping collectionMapping = CollectionMapping.newBuilder() .withCollectionName("example_collection") .withDescription("Test collection") .withFieldTypes(Arrays.asList(idField, vectorField)) .build(); client.createCollection(collectionMapping); System.out.println("Collection Created"); } } 7.4 插入数据 import io.milvus.param.dml.InsertParam; import java.util.*; public class InsertData { public static void main(String[] args) { MilvusServiceClient client = new MilvusServiceClient( ConnectParam.newBuilder().withHost("localhost").withPort(19530).build() ); List<Long> ids = Arrays.asList(1L, 2L, 3L); List<List<Float>> vectors = new ArrayList<>(); vectors.add(Arrays.asList(0.1f, 0.2f, 0.3f, ... 128个值)); vectors.add(Arrays.asList(0.4f, 0.5f, 0.6f, ... 128个值)); InsertParam insertParam = InsertParam.newBuilder() .withCollectionName("example_collection") .withFields(Arrays.asList(ids, vectors)) .build(); client.insert(insertParam); System.out.println("Data Inserted"); } } 7.5 查询相似向量 import io.milvus.param.dml.SearchParam; import io.milvus.param.MetricType; public class SearchVector { public static void main(String[] args) { MilvusServiceClient client = new MilvusServiceClient( ConnectParam.newBuilder().withHost("localhost").withPort(19530).build() ); List<List<Float>> queryVectors = new ArrayList<>(); queryVectors.add(Arrays.asList(0.1f, 0.2f, 0.3f, ... 128个值)); SearchParam searchParam = SearchParam.newBuilder() .withCollectionName("example_collection") .withTopK(5) .withMetricType(MetricType.L2) .withVectors(queryVectors) .build(); System.out.println(client.search(searchParam)); } }8. SaaS 化系统的多租户支持
SaaS 系统中,每个租户(Tenant)应有独立的数据管理方案:
方法 1:独立 Collection 每个租户一个 Collection,例如 tenant1_vectors、tenant2_vectors适用于小规模租户 方法 2:添加租户字段 在同一 Collection 里添加 tenant_id 字段: { "id": 123, "tenant_id": "tenant_A", "vector": [0.1, 0.2, ...] } 查询时加上租户过滤: SearchParam searchParam = SearchParam.newBuilder() .withCollectionName("example_collection") .withFilter("tenant_id = 'tenant_A'") .build(); 方法 3:使用多个 Milvus 实例 适用于大型 SaaS 平台每个租户一个独立的 Milvus 集群需要负载均衡和资源隔离9. Milvus 的应用场景 1) 语义搜索 结合 OpenAI Embeddings,可用于语义搜索(文本相似度计算)。 2) 图像搜索 存储图片特征向量,实现以图搜图功能。 3) 推荐系统 存储用户兴趣向量,计算个性化推荐。 4) 生物信息学 DNA 比对,通过向量相似性计算基因相似度。
10. Milvus vs 其他向量数据库 数据库主要特点适用场景Milvus分布式、云原生、多索引支持NLP、推荐系统、大规模向量数据FAISS高效 GPU 加速,适用于离线任务超大规模数据离线处理Pinecone云托管,易用性强SaaS 应用、无需自己部署Weaviate结合语义搜索,支持 JSON 存储文本搜索、知识库HNSWlib高速图索引,适合小型应用小规模向量检索
11. 总结 Milvus 是一个高性能、可扩展的向量数据库,适用于大规模 AI 应用,尤其适用于NLP、计算机视觉、推荐系统等场景。支持多种索引算法(HNSW、IVF-FLAT、IVF-PQ),可以根据不同的需求进行优化。兼容 PyTorch、TensorFlow、Hugging Face,易于集成到 AI 生态系统中。支持分布式部署,适合云端应用,可以利用 Kubernetes 进行管理。
如果你需要处理数千万甚至上亿的向量数据,Milvus 是一个非常好的选择!
【开源向量数据库】Milvus简介由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【开源向量数据库】Milvus简介”
下一篇
container::erase