开源的向量数据库Milvus

Milvus是一款开源的向量数据库,专为处理向量搜索任务而设计,尤其擅长处理大规模向量数据的相似度检索。

官网地址:https://milvus.io/

以下是关于Milvus的详细介绍:

一、基本概念

  • 向量数据库:Milvus是一款云原生向量数据库,它支持多种类型的向量,如浮点向量、二进制向量等,并且可以处理大规模的向量数据。向量在Milvus中作为基本数据单元,用于表示高维空间中的点,可以是图像、音频、文本等数据的特征表示。
  • 向量搜索:Milvus通过计算向量之间的距离来评估向量之间的相似度,支持高效的相似度搜索和向量索引功能。常见的距离度量包括欧氏距离和余弦相似度等。

二、系统架构与主要组件

Milvus的系统架构遵循数据流和控制流分离的原则,整体分为四个层次:

  1. 接入层(Access Layer):系统的门面,由一组无状态proxy组成,对外提供用户连接的endpoint,负责验证客户端请求并合并返回结果。
  2. 协调服务(Coordinator Service):系统的大脑,负责分配任务给执行节点。协调服务共有四种角色,分别为root coord、data coord、query coord和index coord。
  3. 执行节点(Worker Node):系统的四肢,负责完成协调服务下发的指令和proxy发起的数据操作语言(DML)命令。执行节点分为三种角色,分别为data node、query node和index node。
  4. 存储层(Storage):系统的骨骼,负责Milvus数据的持久化,分为元数据存储(meta store)、消息存储(log broker)和对象存储(object storage)三个部分。

三、核心功能

  1. 高效的向量搜索:Milvus支持在亿级向量中进行毫秒级的搜索,提供了快速的最近邻搜索(Nearest Neighbor Search, NNS)功能。
  2. 多种距离度量:支持多种距离度量方式,包括欧几里得距离(L2)、余弦相似度等,以适应不同的应用需求。
  3. 可扩展性:Milvus设计为分布式系统,可以水平扩展以处理大规模数据集。它支持在Kubernetes上部署,以获得最佳可用性和弹性。
  4. 兼容性:Milvus支持与多种机器学习框架集成,如TensorFlow、PyTorch和PaddlePaddle。
  5. 易用性:提供了简单易用的API,支持多种编程语言,如Python、Java和Go。

四、应用场景

Milvus因其高效的向量搜索能力,广泛应用于以下场景:

  1. 图像搜索:通过比较图像特征向量的相似度来实现图像搜索。
  2. 推荐系统:在推荐系统中,Milvus可以用来检索与用户兴趣向量最相似的商品或内容。
  3. 自然语言处理:Milvus可以用来检索与查询文本最相关的文档或句子。
  4. 音频处理:音频特征向量用于识别或分类音频片段。

五、优势与特点

  1. 高性能:性能高超,可对海量数据集进行向量相似度检索。
  2. 高可用、高可靠:支持在云上扩展,其容灾能力能够保证服务高可用。
  3. 混合查询:支持在向量相似度检索过程中进行标量字段过滤,实现混合查询。
  4. 开发者友好:支持多语言、多工具的Milvus生态系统。

六、开发示例

使用Python结合Milvus实现相似性搜索通常涉及几个关键步骤:安装Milvus和相应的Python客户端库、连接到Milvus服务器、创建集合(Collection)、插入向量数据、构建索引以及执行相似性搜索。以下是一个基本的流程示例:

1. 安装Milvus和Python客户端

首先,确保你已经安装了Milvus服务器,并且它正在运行。然后,安装Milvus的Python客户端库pymilvus

复制代码
pip install pymilvus

2. 连接到Milvus服务器

使用pymilvus客户端连接到你的Milvus服务器。

python 复制代码
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType  
  
# 连接到Milvus服务器  
connections.connect(host='localhost', port='19530')

3. 创建集合

在Milvus中创建一个新的集合,用于存储向量数据。

python 复制代码
# 定义字段模式  
dim = 128  # 向量的维度  
fields = [  
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),  
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=dim)  
]  
  
# 定义集合模式  
schema = CollectionSchema(fields=fields, description="Test collection")  
  
# 创建集合  
collection = Collection("test_collection", schema=schema)

4. 插入向量数据

向集合中插入一些向量数据。

python 复制代码
import numpy as np  
  
# 生成一些随机向量数据  
vectors = [np.random.random(dim).astype(np.float32) for _ in range(100)]  
  
# 插入数据  
collection.insert([{"id": None, "embedding": vec.tolist()} for vec in vectors])  
collection.flush()  # 确保数据被写入存储

5. 构建索引

为了加速相似性搜索,可以在向量字段上构建索引。

python 复制代码
# 假设使用IVF_FLAT索引  
index_params = {"nlist": 16384}  
collection.create_index("embedding", "IVF_FLAT", index_params)

6. 执行相似性搜索

现在,你可以使用一个查询向量来执行相似性搜索。

python 复制代码
# 定义一个查询向量  
query_vec = np.random.random(dim).astype(np.float32)  
  
# 执行搜索  
top_k = 10  # 返回最相似的10个结果  
search_params = {"metric_type": "L2", "params": {"nprobe": 16}}  
results = collection.search("embedding", [query_vec.tolist()], top_k, search_params)  
  
# 打印结果  
for result in results[0]:  
    print(f"ID: {result.id}, Distance: {result.distance}")

7. 清理

完成操作后,可以删除集合或关闭与Milvus的连接。

python 复制代码
# 删除集合  
collection.drop()  
  
# 关闭连接  
connections.disconnect()

综上所述,Milvus作为一款开源的向量数据库,在处理大规模向量搜索任务中表现出色,广泛应用于图像、音频、文本和推荐系统等领域。

相关推荐
数据智能老司机11 分钟前
CockroachDB权威指南——SQL调优
数据库·分布式·架构
数据智能老司机12 分钟前
CockroachDB权威指南——应用设计与实现
数据库·分布式·架构
数据智能老司机26 分钟前
CockroachDB权威指南——CockroachDB 模式设计
数据库·分布式·架构
数据智能老司机19 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机20 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
松果猿20 小时前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库
无名之逆20 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
s91236010120 小时前
rust 同时处理多个异步任务
java·数据库·rust
数据智能老司机20 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
hzulwy21 小时前
Redis常用的数据结构及其使用场景
数据库·redis