主页 > 其他  > 

【开源向量数据库】Milvus简介

【开源向量数据库】Milvus简介

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简介