[向量数据库/AI] Milvus: 开源向量数据库

1 概述:Milvus 向量数据库

简介

  • Milvus 是一个开源云原生向量数据库,专为在海量向量数据集上进行高性能相似性搜索而设计,是 AI 应用和相似性搜索领域的主流解决方案。。

它建立在流行的向量搜索库(包括 Faiss、HNSW、DiskANN 和 SCANN)之上,可为人工智能应用和非结构化数据检索场景提供支持。在继续之前,请先熟悉一下 Embeddings 检索的基本原理

  • Milvus

image

https://ossinsight.io/analyze/milvus-io/milvus

  • License : Apache 2.0

核心定位

  • Milvus 主要解决非结构化数据的检索问题——将图像、文本、音频、视频等通过 AI 模型转换为高维向量(Embedding),然后基于向量相似度进行【快速检索】。

Milvus 是目前最成熟的开源向量数据库之一,特别适合需要处理大规模向量数据、对性能和扩展性有较高要求的企业级 AI 应用。
作为 AI 基础设施的关键组件,它在大模型时代的 RAG 架构中扮演着核心角色。

主要特点

特性 说明
高性能 支持十亿级向量的毫秒级检索,GPU 加速
云原生架构 存算分离设计,支持水平扩展(Kubernetes 部署)
多索引类型 支持 IVF、HNSW、DiskANN 等多种 ANN 索引算法
混合搜索 支持向量搜索 + 标量过滤(metadata filtering)
多语言 SDK 提供 Python、Java、Go、Node.js 等客户端
生态丰富 与 LangChain、LlamaIndex、Spark 等无缝集成
  • 为什么选择Milvus?
  • 高性能。按照官方文档描述,其性能是其他向量数据库(Vector Database)的2-5倍

image

  • 部署方式灵活。灵活意味着入门简单
  • 支持更多的编程语言。主流的Java、Python都支持
  • 可扩展性强、可用性强
  • 价格便宜(这才是最重要的)
  • 社区活跃,大厂加成。很多大厂都在使用Milvus,说明Milvus的优势得到了大厂的认可

image

典型应用场景

  • RAG(检索增强生成):为大语言模型提供外部知识库检索
  • 以图搜图 / 以文搜图:电商商品搜索、版权图片检测
  • 语义搜索:文档、代码、问答系统的智能检索
  • 推荐系统:基于用户/物品向量相似度的个性化推荐
  • 生物信息学:蛋白质序列、基因序列相似性分析

架构版本

  • Milvus 1.x:单机版,已停止维护
  • Milvus 2.x:分布式云原生架构(当前主流
  • Zilliz Cloud:Milvus 的商业托管云服务

与同类产品的对比

产品 特点
Milvus 功能最全面,企业级分布式能力最强
Pinecone 全托管 SaaS,易用但闭源
Weaviate 内置向量化和 GraphQL 接口
Qdrant 轻量级,Rust 编写,性能优秀
pgvector PostgreSQL 扩展,适合已有 PG 生态的用户

快速体验

from pymilvus import MilvusClient

# 连接 Milvus
client = MilvusClient("http://localhost:19530")

# 创建集合
client.create_collection(
    collection_name="demo",
    dimension=768,  # 向量维度
)

# 插入向量数据
client.insert("demo", {
    "id": 1,
    "vector": [0.1, 0.2, ...],  # 768维向量
    "text": "示例文档"
})

# 向量相似性搜索
results = client.search(
    collection_name="demo",
    data=[[query_vector]],
    limit=10
)

2 核心概念、原理与架构

2.1 概念

术语

https://milvus.io/docs/zh/glossary.md

  • AutoID : AutoID 是主字段的一个属性,用于决定是否启用主字段的自动递增。AutoID 的值根据时间戳定义。有关详细信息,请参阅 create_schema 。
  • 自动索引 : Milvus 根据经验数据自动为特定字段决定最合适的索引类型和参数。这非常适合不需要控制特定索引参数的情况。更多信息,请参阅 add_index 。
  • Attu : Attu是 Milvus 的一体化管理工具,可显著降低系统管理的复杂性和成本。
  • Birdwatcher : Birdwatcher是 Milvus 的调试工具,可连接 etcd,实时监控 Milvus 服务器的状态并进行调整。它还支持 etcd 文件备份,帮助开发人员排除故障。

  • 批量编写工具

    Bulk Writer是 Milvus SDK(如 PyMilvus、Java SDK)提供的数据处理工具,旨在将原始数据集转换为与 Milvus 兼容的格式,以便高效导入。

  • 批量插入

    批量插入(Bulk Insert)是一种应用程序接口(API),通过允许在单个请求中导入多个文件来提高写入性能,从而优化大型数据集的操作符。

  • Cardinal

Cardinal 由 Zilliz Cloud 开发,是一种尖端向量搜索算法,可提供无与伦比的搜索质量和性能。凭借创新的设计和广泛的优化,Cardinal 的性能比 Knowhere 高出数倍到一个数量级,同时还能自适应地处理不同的生产场景,如不同的 K 大小、高过滤、不同的数据分布等。

  • 通道

Milvus 采用两种类型的通道,即P通道和V 通道,作为其流媒体服务架构的一部分。每个 PChannel 对应一个由Woodpecker 管理的 WAL 流,而每个 VChannel 对应一个 Collections 中的一个分片。流服务管理这些通道,以确保数据一致性和故障恢复。

  • Collections

在 Milvus 中,Collection 相当于关系数据库管理系统(RDBMS)中的。Collections 是用于存储和管理实体的主要逻辑对象。更多信息,请参阅管理 Collections

  • 依赖程序

依赖程序是另一个程序赖以运行的程序。Milvus 的依赖程序包括 etcd(存储元数据)、MinIOS3(对象存储)和 Pulsar(管理快照日志)。更多信息,请参阅管理依赖关系

组件 数据用途 特点 可替换方案
etcd 元数据 强一致性、小数据量、高频读取 一般不可替换
对象存储 向量/索引/日志 大容量、高吞吐、低成本 MinIO、AWS S3、阿里云 OSS 等
Pulsar 消息流 高吞吐、持久化、可回溯 Kafka(Milvus 2.3+ 支持)、RocksMQ(单机版)

写入流程示例

  1. 客户端 → Proxy 写入向量
  2. Proxy → Pulsar 发送消息
  3. DataNode 消费 Pulsar 消息,写入 对象存储
  4. etcd 更新元数据(如 Segment 信息)

这种架构实现了计算与存储分离,使 Milvus 能够独立扩展查询能力存储容量

  • etcd — 元数据存储

    • 用途:存储 Milvus 的元数据(metadata)

    • 保存 Collection、Schema、索引定义等结构信息

    • 记录各组件(Proxy、QueryNode、DataNode 等)的服务发现和节点状态

    • 协调分布式系统中的配置变更和 Leader 选举

      • 类比:etcd 相当于 Milvus 的"大脑记忆",负责记住"有哪些表、字段是什么类型、哪些节点在线"等关键信息。
  • 对象存储(MinIO/S3/OSS)— 持久化数据存储

    • 用途:存储实际的向量数据和日志

    • 保存原始的向量数据、标量数据

    • 存储增量数据变更日志(binlog)

    • 保存索引文件(如 IVF、HNSW 等构建好的索引)

      • 类比:对象存储是 Milvus 的"硬盘",存放海量的向量数据和索引文件,要求大容量、高可靠、低成本。
  • Pulsar — 消息队列与流处理

    • 用途实时数据流和日志传输

    • 接收客户端写入的向量数据,实现异步削峰

    • 在 DataNode 之间传递数据变更事件

    • 保证数据的可靠传输和顺序性,支持数据恢复

      • 类比:Pulsar 是 Milvus 的"神经系统",负责在各组件间快速、可靠地传递数据写入请求和变更通知。
  • 动态模式 Schema

动态模式允许您在不修改现有模式的情况下,将带有新字段的实体插入 Collections。

这意味着您可以在不知道 Collections 的完整模式的情况下插入数据,并可以包含尚未定义的字段。

您可以在创建 Collections 时启用动态字段,从而启用这种无 Schema 功能。有关详细信息,请参阅启用动态字段

  • 嵌入

Milvus 提供内置嵌入功能,可与流行的嵌入提供商配合使用。

在 Milvus 中创建 Collections 之前,您可以使用这些功能为数据集生成嵌入,从而简化准备数据和向量搜索的过程。

要在实际操作中创建嵌入,请参阅使用 PyMilvus 的模型生成文本嵌入

  • 实体

实体由一组表示现实世界对象的字段组成。Milvus 中的每个实体都有一个唯一的主键

Milvus 支持两种主键分配方式用户自定义主键自动分配主键AutoID

当创建 Collection 时启用 auto_id=True,Milvus 会自动为每个插入的实体生成唯一主键。

你可以自定义主键

如果不手动配置,Milvus 会自动为实体分配主键。

如果选择自定义主键,请注意 Milvus 暂时不支持主键去重。因此,同一 Collections 中可能存在重复的主键。有关详细信息,请参阅插入实体

主键的特性总结

特性 说明
数据类型 仅支持 INT64
唯一性保证 全局唯一,分布式环境下也不会冲突
单调递增 主键按时间趋势递增(非严格连续)
不可指定 启用 auto_id 后,插入时传入主键会被忽略
查询方式 通过 insert() 返回结果获取分配的主键

主键生成机制

Milvus 使用 Twitter Snowflake 算法 生成主键:

| 1 bit 符号位 | 41 bit 时间戳 | 10 bit 节点ID | 12 bit 序列号 |
  • 时间戳:毫秒级,支持约 69 年
  • 节点ID:区分不同 Proxy 节点
  • 序列号:同一毫秒内支持 4096 个 ID

这保证了在分布式部署下的全局唯一性趋势递增性

两种主键的对比:

场景 推荐方式 原因
已有业务主键(如用户ID、订单号) 自定义主键 便于与业务系统关联
纯向量检索场景,无业务ID 自动分配主键 简化开发,避免ID冲突
需要严格连续递增ID 自定义主键 Snowflake 不保证连续

注意事项

  1. 创建后不可修改auto_id 在 Collection 创建后无法更改
  2. upsert 限制:启用 auto_id 时,upsert 操作实际上会先删除再插入,主键会变化
  3. 获取主键:务必保存 insert() 返回的 MutationResult,否则无法获知分配的主键值
  • 字段

Milvus Collections 中的字段相当于 RDBMS 表中的列。字段可以是结构化数据(如数字、字符串)的标量字段,也可以是嵌入向量的向量字段

  • 过滤

Milvus 支持通过谓词搜索进行标量过滤,允许您在查询和搜索中定义过滤条件,以完善搜索结果。

  • 过滤搜索

过滤搜索将标量过滤器应用于向量搜索,允许你根据特定条件完善搜索结果。更多信息,请参阅过滤搜索

  • 混合搜索

混合搜索是自 Milvus 2.4.0 以来的混合搜索 API。您可以搜索多个向量场并进行融合。对于与标量字段过滤相结合的向量搜索,称为 "过滤搜索"。更多信息,请参阅混合搜索

  • 索引

向量索引是从原始数据衍生出来的重组数据结构,可以大大加快向量相似性搜索的过程

Milvus 支持向量场标量场的多种索引类型。更多信息,请参阅向量索引类型

  • Kafka-Milvus 连接器

Kafka-Milvus 连接器指的是 Milvus 的 Kafka 汇连接器。它允许你将向量数据从 Kafka 流式传输到 Milvus。

  • Knowhere

Knowhere是 Milvus 的核心向量执行引擎,它集成了多个向量相似性搜索库,包括 Faiss、Hnswlib 和 Annoy。Knowhere 还旨在支持异构计算。

它可以控制在哪个硬件(CPU 或 GPU)上执行索引构建和搜索请求。这就是 Knowhere 名字的由来--知道在哪里执行操作符。

  • 日志快照

日志快照是二进制日志,是段中较小的单元,记录并处理 Milvus 中数据的更新和更改。

段(Segment)中的数据会被持久保存在多个二进制日志中。

Milvus 中有三种二进制日志:InsertBinlog、DeleteBinlog 和 DDLBinlog。

更多信息,请参阅元存储

  • 度量类型

相似度度量类型用于度量向量之间的相似度。

目前,Milvus 支持欧氏距离(L2)、内积(IP)、余弦相似度(COSINE)和二元度量类型

你可以根据你的情况选择最合适的度量类型。更多信息,请参阅 "相似度量"

  • 欧式距离:多维空间中两点之间的直线最短距离,用于衡量点与点之间的绝对距离。

通俗易懂:欧氏与标准欧氏距离(举例) - Zhihu

  • 内存缓冲器

MemoryBuffer 是啄木鸟的一种轻量级部署模式,它可以在内存中临时缓冲写入的内容,并定期将其刷新到云对象存储中。该模式最适合小规模部署中的批量繁重工作负载,或优先考虑简单性而不是性能的生产环境。有关详细信息,请参阅Woodpecker 架构

  • 内存映射

内存映射文件可将文件内容直接映射到内存中,从而实现高效的数据处理

这在内存有限而又无法加载所有数据时特别有用。这种技术可以提高数据容量,并在一定程度上保持性能。

但是,如果数据大大超出内存容量,搜索和查询速度就会大大降低。

有关详细信息,请参阅启用 MMap 的数据存储

  • Milvus 备份

Milvus 备份是一种创建数据副本的工具,可用于在数据丢失事件发生后恢复原始数据。

  • Milvus CDC

Milvus CDC(变更数据捕获)是一个用户友好型工具,可以捕获和同步 Milvus 实例中的增量数据。它通过在源实例和目标实例之间无缝传输数据来确保业务数据的可靠性,从而轻松实现增量备份和灾难恢复。

  • Milvus CLI

Milvus 命令行界面(CLI)是一种命令行工具,支持数据库连接、数据操作和数据导入导出。它基于Milvus Python SDK,允许通过终端使用交互式命令行提示执行命令。

  • Milvus 迁移

Milvus 迁移是一个开源工具,旨在方便将数据从各种数据源轻松迁移到 Milvus 2.x。

  • Milvus 集群

在 Milvus集群部署中,服务由一组节点提供,以实现高可用性和易扩展性。

  • Milvus 单机版

在 Milvus 的独立部署中,所有操作包括数据插入、索引建立和向量相似性搜索都在一个进程中完成。

  • 多向量

Milvus 自 2.4.0 起支持在一个 Collections 中使用多个向量字段。更多信息,请参阅混合搜索

  • 分区

分区是对 Collections 的划分。Milvus 支持在物理存储上将 Collections 数据分成多个部分。这一过程称为分区,每个分区可以包含多个部分。有关详细信息,请参阅管理分区

  • 分区键

字段的 Partition Key 属性可根据实体的 Partition Key 值将实体隔离成不同的分区。

这种分组可确保将共享相同键值的实体存储在一起,这样就可以让系统在通过分区键字段过滤的查询过程中绕过无关的分区,从而加快搜索操作。更多信息,请参阅使用分区关键字

  • P通道

PChannel 表示物理通道。每个 PChannel 对应一个由啄木鸟管理的 WAL 流。默认情况下,当 Milvus 集群启动时,将分配一组 PChannels 来存储记录数据插入、删除和更新的日志。有关详细信息,请参阅流服务

  • PyMilvus

PyMilvus 是 Milvus 的 Python SDK。其源代码开源并托管在GitHub 上。你可以灵活选择 MilvusClient(新版 Python SDK)或原始 ORM 模块与 Milvus 通信。

  • 查询

查询Query)是一种以指定的布尔表达式作为过滤器进行标量过滤的 API。更多信息,请参阅Get & Scalar Query

  • QuorumBuffer

QuorumBuffer 是啄木鸟(Woodpecker)的一种部署模式,专为对延迟敏感、需要实时响应能力和强大容错能力的高频读/写工作负载而设计。它作为一个高速写缓冲区,具有三重法定人数写入功能,可确保较强的一致性和高可用性。如需了解更多信息,请参阅啄木鸟架构

  • 范围搜索

通过范围搜索,可以找到与搜索向量保持一定距离的向量。更多信息,请参阅范围搜索

  • 模式

Schema 是定义数据类型和数据属性的元信息。每个 Collections 都有自己的 Collections Schema,该 Schema 定义了 Collections 的所有字段、自动 ID(主键)分配启用和 Collection 说明。字段模式也包含在 Collections 模式中,它定义了字段的名称、数据类型和其他属性。有关详细信息,请参阅管理 Schema

  • 搜索

搜索是一种 API,用于执行进行向量相似性搜索的操作符,执行时需要向量数据。更多信息,请参阅单向量搜索

  • 数据段

段是一个自动创建的数据文件,用于存储插入的数据。一个 Collections 可能包含多个分段,每个分段可以容纳许多实体。在向量相似性搜索过程中,Milvus 会检查每个分段以编译搜索结果。

段有两种类型:成长段和封存段。成长型网段会继续 Collections 新数据,直到达到特定的阈值或时间限制,之后就会被封存。一旦封存,分段就不再接受新数据,并被转移到对象存储区。与此同时,传入的数据会被路由到新的增长段。达到预定义的实体限制或超过生长状态允许的最长持续时间,都会触发从生长网段到密封网段的转换。更多信息,请参阅设计细节

  • Spark-Milvus 连接器

Spark-Milvus Connector提供 Apache Spark 和 Milvus 之间的无缝集成,将 Apache Spark 的数据处理和机器学习(ML)功能与 Milvus 的向量数据存储和搜索功能相结合。

  • 碎片

Milvus 通过使用基于主键散列组织的分片将写操作分布在多个节点上,从而提高了数据写入性能。这充分利用了集群的并行计算能力。

分区通过指定分区名称来减少读取负载,而分片则将写入负载分散到多个服务器上。

  • 稀疏向量

稀疏向量使用向量 Embeddings 表示单词或短语,其中大部分元素为零,只有一个非零元素表示存在特定单词。稀疏向量模型(如 SPLADEv2)在域外知识搜索、关键词感知和可解释性方面优于密集模型。更多信息,请参阅稀疏向量

  • 流服务

流服务是 Milvus 内部流系统模块的一个概念,围绕前向写日志(WAL)构建,以支持各种流相关功能。这些功能包括流式数据摄取/订阅、集群状态故障恢复、将流式数据转换为历史数据以及增长数据查询。该服务由流协调器、流节点集群和流客户端组件组成。更多信息,请参阅流服务

  • 非结构化数据

非结构化数据包括图像、视频、音频和自然语言,是不遵循预定义模型或组织方式的信息。这种数据类型约占全球数据的 80%,可使用各种人工智能(AI)和 ML 模型转换成向量。

  • VChannel

VChannel 代表虚拟通道。每个 VChannel 代表一个 Collections 中的一个分片。每个 Collections 会分配一组 VChannels,用于记录数据的插入、删除和更新。VChannels 在逻辑上是分开的,但通过流服务在物理上共享资源。有关详细信息,请参阅流服务

  • 向量

嵌入向量是对电子邮件、物联网传感器数据、Instagram 照片、蛋白质结构等非结构化数据的特征抽象。从数学角度讲,嵌入向量是浮点数或二进制数组。现代嵌入技术用于将非结构化数据转换为嵌入向量。Milvus 自 2.4.0 起支持密集向量和稀疏向量。

  • WAL 存储

先写日志(WAL)存储是分布式系统中数据持久性和一致性的基础。

在提交任何更改之前,首先要将其记录在日志中,以确保在发生故障时,可以准确恢复到之前的位置。

Milvus 使用 Woodpecker 作为 WAL 存储系统,它支持 MemoryBuffer 和 QuorumBuffer 两种模式。

有关详细信息,请参阅Woodpecker 架构

  • 啄木鸟

Woodpecker 是 Milvus 2.6 中的云原生 WAL 系统,取代了 Kafka 和 Pulsar。它采用零磁盘架构和两种部署模式(MemoryBuffer 和 QuorumBuffer),可在对象存储上提供高吞吐量、低操作符开销和无缝可扩展性。欲了解更多信息,请参阅啄木鸟架构

  • Zilliz Cloud

Zilliz Cloud 上全面管理 Milvus,具有更多企业级功能和高度优化的性能。

架构-概述

架构图

  • Milvus 的高层架构,展示了其模块化、可扩展和云原生的设计,以及完全分解的存储层和计算层。

image

架构原则

  • Milvus 遵循数据面控制面分解的原则,由四个主要层组成,在可扩展性灾难恢复方面相互独立。这种共享存储架构具有完全分解的存储层计算层,可实现计算节点的横向扩展,同时将啄木鸟作为零磁盘 WAL 层实施,以增强弹性并减少操作开销。

  • 通过将流处理分为流节点(Streaming Node)和批处理分为查询节点(Query Node)和数据节点(Data Node),Milvus 在满足实时处理要求的同时实现了高性能。

详细的层架构

第 1 层:访问层

访问层由一组无状态代理(Proxy)组成,是系统的前端层,也是用户的终端。它验证客户端请求减少返回结果

  • 代理(Proxy)本身是无状态的。它使用 Nginx、Kubernetes Ingress、NodePort 和 LVS 等负载均衡组件提供统一的服务地址。
  • 由于 Milvus 采用的是大规模并行处理(MPP)架构,代理会对中间结果进行聚合和后处理,然后再将最终结果返回给客户端。
第 2 层:协调器

协调器(coordinator)是 Milvus 的大脑。在任何时刻,整个集群都有一个协调器在工作,负责维护集群拓扑结构调度所有任务类型保证集群级一致性

以下是协调员处理的部分任务:

  • DDL/DCL/TSO 管理:处理数据定义语言 (DDL) 和数据控制语言 (DCL) 请求,如创建或删除 Collections、分区或索引,以及管理时间戳 Oracle (TSO) 和时间刻度签发。
  • 流服务管理:将预写日志WAL)与流节点绑定,并为流服务提供服务发现功能。
  • 查询管理:管理查询节点的拓扑结构和负载平衡,并提供和管理服务查询视图,以指导查询路由。
  • 历史数据管理:将压缩和索引建立等离线任务分配给数据节点,并管理数据段和数据视图的拓扑结构。
第 3 层:工作节点

手臂和腿。工作节点是遵从协调器指令的哑执行器。由于存储和计算分离,工作节点是无状态的,部署在 Kubernetes 上时可促进系统扩展灾难恢复。工作节点有三种类型:

流节点
  • 流节点(Streaming Node)作为碎片级的 "小型大脑",基于底层 WAL 存储提供碎片级的一致性保证和故障恢复。同时,流节点还负责增长数据查询和生成查询计划。此外,它还负责将增长数据转换为封存(历史)数据。
查询节点
  • 查询节点从对象存储中加载历史数据,并提供历史数据查询。
数据节点
  • 数据节点负责离线处理历史数据,如压缩和建立索引。
第 4 层:存储

存储是系统的骨骼,负责数据的持久性。它包括元存储、日志代理和对象存储。

元存储
  • 元存储存储元数据快照,如 Collections Schema 和消息消耗检查点。元数据的存储要求极高的可用性、强一致性和事务支持,因此 Milvus 选择 etcd 作为元存储。Milvus 还使用 etcd 进行服务注册健康检查
对象存储
  • 对象存储用于存储日志快照文件标量向量数据的索引文件以及中间查询结果
  • Milvus 使用 MinIO 作为对象存储,可随时部署在 AWS S3 和 Azure Blob 这两个全球最流行、最具成本效益的存储服务上。
  • 然而,对象存储的访问延迟较高,并按查询次数收费。
  • 为了提高性能并降低成本,Milvus 计划在基于内存或固态硬盘的缓存池上实现冷热数据分离
WAL 存储
  • 预写日志(WAL)存储是分布式系统数据持久性一致性的基础。在提交任何更改之前,首先要将其记录在日志中,以确保在发生故障时,可以准确恢复到之前的位置。

  • 常见的 WAL 实现包括 Kafka、Pulsar 和 Woodpecker。与传统的基于磁盘的解决方案不同,Woodpecker 采用云原生的零磁盘设计,直接写入对象存储。这种方法可以毫不费力地根据您的需求进行扩展,并通过消除管理本地磁盘的开销来简化操作符。

  • 通过提前记录每次写入操作,WAL 层保证了可靠的全系统恢复和一致性机制--无论你的分布式环境发展得多么复杂。

数据流和 API 类别

  • Milvus API 按其功能分类,并遵循架构的特定路径:
应用程序接口类别 操作符 示例应用程序接口 架构流程
DDL/DCL Schema 和访问控制 createCollection,dropCollection,hasCollectioncreatePartition 访问层 → 协调器
DML 数据操作 insert,deleteupsert 访问层 → 流工作节点
数据查询 数据查询 search,query 访问层 → 批量工作节点(查询节点)
数据流示例:搜索操作符
  1. 客户端通过 SDK/RESTful API 发送搜索请求
  2. 负载平衡器将请求路由到访问层的可用代理
  3. 代理使用路由缓存确定目标节点;只有在缓存不可用时才联系协调器
  4. 代理将请求转发到适当的流节点,然后与查询节点协调进行密封数据搜索,同时在本地执行增长数据搜索
  5. 查询节点根据需要从对象存储中加载密封分段,并执行分段级搜索
  6. 对搜索结果进行多级缩减:查询节点还原多个分段的结果,流节点还原查询节点的结果,代理还原所有流节点的结果,然后返回客户端
数据流示例:数据插入
  1. 客户端发送带有向量数据的插入请求
  2. 访问层验证请求并转发给流节点
  3. 流节点将操作符记录到 WAL 存储,以确保持久性
  4. 实时处理数据并提供查询
  5. 当分段达到容量时,流节点触发转换为密封分段
  6. 数据节点处理压缩,并在密封网段上建立索引,将结果存储在对象存储
  7. 查询节点加载新建索引并替换相应的增长数据
下一步

架构-主要组件

  • Milvus 集群由5个核心组件和3个第三方依赖项组成。每个组件都可以独立部署在 Kubernetes 上:

Milvus 组件

  • 协调器:可启用主从模式,以提供高可用性。
  • 代理:每个集群一个或多个
  • 流节点:每个集群一个或多个
  • 查询节点:每个群集一个或多个
  • 数据节点:每个群集一个或多个

第三方依赖

  • 元存储:存储 Milvus 中各种组件的元数据,如 etcd。
  • 对象存储: 负责 Milvus 中索引和二进制日志文件等大型文件的数据持久化,例如 MinIOn / S3
  • WAL 存储:为 Milvus 提供先写日志(WAL)服务,如 woodpecker。
    • 啄木鸟零(Woodpecker)磁盘模式下,WAL直接使用对象存储和元存储,无需其他部署,减少第三方依赖。

Milvus 部署模式

运行 Milvus 有两种模式:

独立运行/Standalone
  • 在一个进程中运行所有组件的 Milvus 单实例,适用于数据集小、工作量小的情况。
  • 此外,在 Standalone 模式下,可以选择更简单的 WAL 实现,如 woodpecker 和 rocksmq,以消除对第三方 WAL 存储依赖的要求。

image

  • 目前,即使 WAL 存储后端支持集群模式,也无法从 Milvus 独立实例在线升级到 Milvus 集群。
集群/Cluster
  • Milvus 的一种分布式部署模式,每个组件独立运行,并可进行弹性扩展。这种设置适用于大型数据集和高负荷场景。

image

下一步

架构-流媒体服务

架构-数据处理

架构-Woodpecker/啄木鸟

  • 啄木鸟 | Milvus 文档

  • 在 Milvus 2.6 中,Woodpecker 使用专门构建的云原生先写日志(WAL)系统取代了 Kafka 和 Pulsar。Woodpecker 专为对象存储而设计,可简化操作、最大化吞吐量并轻松扩展。

  • 啄木鸟的设计目标

    • 云环境中的最高吞吐量
    • 持久、仅附加日志记录,实现可靠恢复
    • 操作符最少,无需本地磁盘或外部代理

架构-Knowhere(向量执行引擎 )

Milvus 的核心向量执行引擎 Knowhere。

Knowhere | Milvus 文档

  • Knowhere 是 Milvus 的核心向量执行引擎,它集成了多个向量相似性搜索库,包括FaissHnswlibAnnoy。Knowhere 的设计还支持异构计算。
  • 它可以控制在哪个硬件(CPU 或 GPU)上执行索引构建和搜索请求。这就是 Knowhere 名字的由来--知道在哪里执行操作符
  • 未来的版本将支持更多类型的硬件,包括 DPU 和 TPU。

Milvus架构中的Knowhere

  • Knowhere 在 Milvus 架构中的位置:

image

  • 最底层是系统硬件。上面是第三方索引库。在最上层,Knowhere通过CGO与索引节点和查询节点交互,CGO允许Go包调用C代码。

度量类型

  • 相似度量用于衡量向量之间的相似性。选择合适的距离度量有助于显著提高分类和聚类性能。
  • 目前,Milvus 支持这些类型的相似性度量
    • 欧氏距离 (L2)
    • 内积 (IP)
    • 余弦相似度 (COSINE)
    • JACCARD,HAMMINGBM25 (专门为稀疏向量的全文检索而设计)。

不同字段类型与支持的度量类型之间的映射关系

下表总结了不同字段类型与相应度量类型之间的映射关系。

字段类型 维度范围 支持的度量类型 默认度量类型
FLOAT_VECTOR 2-32,768 COSINE,L2IP COSINE
FLOAT16_VECTOR 2-32,768 COSINE,L2IP COSINE
BFLOAT16_VECTOR 2-32,768 COSINE,L2IP COSINE
INT8_VECTOR 2-32,768 COSINE,L2IP COSINE
SPARSE\_FLOAT\_VECTOR 无需指定维度。 IP,BM25 (仅用于全文检索) IP
BINARY_VECTOR 8-32,768*8 HAMMING,JACCARDMHJACCARD HAMMING

NOTE

  • 对于SPARSE\_FLOAT\_VECTOR 类型的向量场,仅在执行全文检索时使用BM25 公制类型。有关详细信息,请参阅全文搜索
  • 对于BINARY_VECTOR 类型的向量字段,维度值 (dim) 必须是 8 的倍数。

所有支持的度量类型的相似性距离值特征及其取值范围

下表总结了所有支持的度量类型的相似性距离值特征及其取值范围。

度量类型 相似性距离值的特征 相似性距离值范围
L2 值越小,表示相似度越高。 [0, ∞)
IP 值越大,表示相似度越高。 [-1, 1]
COSINE 值越大,表示相似度越高。 [-1, 1]
JACCARD 值越小,表示相似度越高。 [0, 1]
MHJACCARD 根据 MinHash 签名位估算 Jaccard 相似度;距离越小 = 越相似 [0, 1]
HAMMING 值越小表示相似度越高。 [0,dim(向量)
BM25 根据术语频率、反转文档频率和文档规范化对相关性进行评分。 [0, ∞)

NOTE

要在 "结构数组 "字段中索引向量字段,应根据存储在这些字段中的向量嵌入,将MAX_SIM 作为上述度量类型集的前缀。例如

  • 对于存储FLOAT_VECTOR,FLOAT16_VECTOR,BFLOAT16_VECTOR, 或INT8_VECTOR 类型的向量嵌入的向量字段,可以使用MAX_SIM_COSINE,MAX_SIM_IP, 或MAX_SIM_L2 作为度量类型。
  • 对于存储BINARY_VECTOR 类型的向量嵌入的向量场,可以使用MAX_SIM_JACCADRMAX_SIM_HAMMING 作为度量类型。

欧氏距离(L2)

  • 从本质上讲,欧氏距离测量的是连接两点的线段的长度。

这是最常用的距离度量,在数据连续时非常有用。

欧氏距离的计算公式如下:

\[d(a, b) = d(b, a) = \sqrt{\sum_{i=0}^{n-1} (b_i - a_i)^2} \]

其中a = (a0,a1,...,an-1)b = (b0,b1,...,bn-1)是 n 维欧几里得空间中的两点。

当选择欧氏距离作为距离度量时,Milvus 只计算应用平方根之前的值。

内积(IP)

  • 向量内积(别称:点积点乘数量积):将两个向量对应分量相乘后求和得到的标量,其几何意义是一个向量在另一个向量方向上的投影乘以长度。

a⋅b=∣a∣∣b∣cosθ

其中 ∣ a ∣ 和 ∣ b ∣分别是向量的模长, θ 是两向量的夹角,0 ≤ θ ≤ π。

在坐标形式下,若 a=(a1,a2,...,an),b=(b1,b2,...,bn),则内积可表示为:

a⋅b=a1b1+a2b2+...+anbn

  • 几何意义
  1. 投影解释:内积等于向量 a 的模长乘以向量 ba 方向上的投影长度。
  2. 夹角关系:通过内积可以求两向量夹角:

cos⁡θ=a⋅b∣a∣∣b∣cosθ=∣a∣∣bab

点乘的代数定义,推导几何定义(用于求向量夹角)

image

  1. 正交条件:若 a⋅b=0,则两向量互相垂直。
  • 内积 vs 外积

image

  • 两个 Embeddings 之间的 IP 距离定义如下:

\[p(A, B) = A \cdot B = \sum_{i=0}^{n-1} a_i \cdot b_i \]

  • 如果需要比较非标准化数据,或者需要考虑幅度和角度,IP 会更有用。

  • 如果使用 IP 计算嵌入式之间的相似性,必须对嵌入式进行归一化处理。归一化后,内积等于余弦相似度。

  • 假设 X' 是由嵌入式 X 归一化而来:

\[X' = (x'_1, x'_2, \dots, x'_n),\ X' \in \mathbb{R}^n \]

归一化公式

  • 两个嵌入式之间的相关性如下:

\[x'_i = \frac{x_i}{\|X\|} = \frac{x_i}{\sqrt{\sum_{i=1}^{n} (x_i)^2}} \]

嵌入式之间的相关性(向量归一化(L2 范数归一化))

余弦相似性

  • 余弦相似度使用两组向量之间角度的余弦来衡量它们的相似程度。你可以把两组向量看成从同一点(如 [0,0,...])出发,但指向不同方向的线段。

  • 要计算两组向量A = (a0,a1,...,an-1)和B = (b0,b1,...,bn-1) 之间的余弦相似度,请使用下面的公式:

\[\cos\theta = \frac{\sum_{i=0}^{n-1} (a_i \cdot b_i)}{\sqrt{\sum_{i=0}^{n-1} a_i^2} \cdot \sqrt{\sum_{i=0}^{n-1} b_i^2}} \]

  • 余弦相似度总是在区间[-1, 1] 内。
    • 例如,两个正比向量的余弦相似度为1,两个正交向量的余弦相似度为0,两个相反向量的余弦相似度为-1
    • 余弦越大,两个向量之间的夹角越小,说明这两个向量之间的相似度越高。

用 1 减去它们的余弦相似度,就可以得到两个向量之间的余弦距离。

JACCARD 距离

  • JACCARD 距离系数衡量两个样本集之间的相似性,其定义为定义集的交集的卡方值除以它们的联合的卡方值。它只能应用于有限样本集。

这种距离度量可以用来评估两个集合的区分度,特别是在数据分析和机器学习领域中,杰卡德距离被广泛应用于样本相似度的计算。

\[J(A, B) = \frac{|A \cap B|}{|A| + |B| - |A \cap B|} \]

JACCARD 相似度系数公式 = 交集大小 ÷ 并集大小

  • JACCARD 距离,可测量数据集之间的不相似性,用 1 减去 JACCARD 相似系数即可得到。

\[d_j(A, B) = 1 - J(A, B) = \frac{|A \cup B| - |A \cap B|}{|A \cup B|} \]

JACCARD 距离公式 = 1 − JACCARD 相似度

  • 一句话总结:

    • 交集越多、越相似 → JACCARD 距离越小;
    • 几乎无交集 → JACCARD 距离接近 1
  • 案例1:水果数据集

A = {苹果,香蕉,橙子},B = {香蕉,橙子,西瓜}

1)交集 A∩B = {香蕉,橙子} → 大小 2

2)并集 A∪B = {苹果,香蕉,橙子,西瓜} → 大小 4

3)相似度 = 2/4 = 0.5

4)距离 = 1 − 0.5 = 0.5

解读:一半重合,不远不近。

  • 案例2: 文本分词去重场景(NLP 常用)

句子 1:我 喜欢 吃 苹果,句子 2:我 喜欢 吃 西瓜

去重集合:

​ S1={我,喜欢,吃,苹果}

​ S2={我,喜欢,吃,西瓜}

交集 = 3,并集 = 5

相似度 = 3/5=0.6

距离 =0.4

  • 案例3:二进制向量 / 特征掩码(工程非常常见)

只看哪些位置是 1(当作集合)

​ x = 1 0 1 1;

​ y = 1 1 0 1;

共同为 1(交集位):第 1、4 位 → 2

任意为 1(并集位):1,2,3,4 → 4

距离 = 1 − 2/4 = 0.5

  • python版实现
def jaccard_dist(A, B):
    s1 = set(A)
    s2 = set(B)
    inter = len(s1 & s2)
    union = len(s1 | s2)
    return 1.0 - inter / union if union != 0 else 0.0

print(jaccard_dist(["苹果","香蕉","橙子"],["香蕉","橙子","西瓜"]))
# 0.5

MHJACCARD

  • MinHash Jaccard(MHJACCARD) 是一种度量类型,用于在大型集合(如文档单词集、用户标签集或基因组 k-mer 集)上进行高效、近似的相似性搜索。MHJACCARD 不直接比较原始集,而是比较MinHash 签名MinHash 签名是专为高效估计 Jaccard 相似性而设计的紧凑表示法。

这种方法比计算精确的 Jaccard 相似性要快得多,尤其适用于大规模或高维场景。

  • 适用向量类型

    • BINARY_VECTOR,其中每个向量存储一个 MinHash 签名。每个元素都对应于应用于原始集合的一个独立哈希函数下的最小哈希值。
  • 距离定义

MHJACCARD 衡量两个 MinHash 签名中匹配位置的数量。匹配率越高,说明底层集越相似。

Milvus 报告:

距离 = 1 - 估计相似度(匹配率)

距离值从 0 到 1 不等:

  • 0表示 MinHash 签名完全相同(估计 Jaccard 相似度 = 1)
  • 1表示任何位置都不匹配(估计的 Jaccard 相似度 = 0)

有关技术细节的信息,请参阅MINHASH_LSH

HAMMING 距离

  • HAMMING 距离测量二进制数据字符串。两个长度相等的字符串之间的距离是比特不同的比特位置数

  • 例如,假设有两个字符串:

    • 1101 1001
    • 1001 1101

11011001 ⊕ 10011101 = 01000100.

由于其中包含两个 1,因此 HAMMING 距离 d (11011001, 10011101) = 2。

BM25 相似性

BM25 是一种广泛使用的文本相关性测量方法,专门用于全文检索。它结合了以下三个关键因素:

  • 术语频率 (TF):衡量术语在文档中出现的频率。虽然较高的频率通常表示较高的重要性,但 BM25 使用饱和参数k1来防止过于频繁的术语主导相关性得分。
  • 反向文档频率(IDF):反映术语在整个语料库中的重要性。在较少文档中出现的术语会获得较高的 IDF 值,这表明其对相关性的贡献更大。
  • 文档长度归一化:较长的文档由于包含较多的术语,往往得分较高。BM25 通过对【文档长度】进行【归一化】处理来减轻这种偏差,参数b 控制这种归一化处理的强度。

BM25 评分的计算方法如下:

\[score(D, Q) = \sum_{i=1}^{n} IDF(q_i) \cdot \frac{TF(q_i, D) \cdot (k_1 + 1)}{TF(q_i, D) + k_1 \cdot \left(1 - b + b \cdot \frac{|D|}{avgdl}\right)} \]

参数描述

  • Q:用户提供的查询文本。

  • D:被评估的文档。

  • TF(qi, D):术语频率,表示术语qi在文档 D 中出现的频率。

  • DFIDF(qi):反向文档频率,计算公式为

    \[IDF(q_i) = \log\left( \frac{N - n(q_i) + 0.5}{n(q_i) + 0.5} + 1 \right) \]

    其中N 是语料库中的文档总数,nn(qi) 是包含术语 qi 的文档数。

  • ∣D∣:文档长度D(术语总数)。

  • avgdl:语料库中所有文档的平均长度。

  • k1 :控制词频对评分的影响。数值越大,词频越重要。典型的范围是 [1.2, 2.0],而 Milvus 允许的范围是 [0, 3]。

  • b:控制长度归一化的程度,范围从 0 到 1。当值为 0 时,不进行归一化处理;当值为 1 时,进行完全归一化处理。

2.2 数据库

  • Milvus 在集合之上引入了数据库层,为管理和组织数据提供了更有效的方式,同时支持多租户。

什么是数据库

  • 在 Milvus 中,数据库是组织和管理数据的逻辑单元
  • 为了提高数据安全性并实现多租户,你可以创建多个数据库,为不同的应用程序或租户从逻辑上隔离数据。例如,创建一个数据库用于存储用户 A 的数据,另一个数据库用于存储用户 B 的数据。

创建数据库

  • 您可以使用 Milvus RESTful API 或 SDK 以编程方式创建数据。

python

from pymilvus import MilvusClient

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus"
)

client.create_database(
    db_name="my_database_1"
)

curl

export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/databases/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "dbName": "my_database_1"
}'
  • 您还可以在创建数据库时为其设置属性。下面的示例设置了数据库的副本数量。
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/databases/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "dbName": "my_database_2",
    "properties": {
        "database.replica.number": 3
    }
}'

查看数据库

  • 可以使用 Milvus RESTful API 或 SDK 列出所有现有数据库并查看其详细信息。
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/databases/describe" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "dbName": "default"
}'

管理数据库属性

  • 每个数据库都有自己的属性,您可以在创建数据库时设置数据库属性(如创建数据库中所述),也可以更改和删除任何现有数据库的属性。

下表列出了可能的数据库属性。

属性名称 类型 属性描述
database.replica.number 整数 指定数据库的副本数量。
database.resource_groups 字符串 以逗号分隔的列表形式列出的与指定数据库相关的资源组名称。
database.diskQuota.mb 整数 指定数据库的最大磁盘空间大小(MB)。
database.max.collections 整数 指定数据库中允许的最大 Collections 数量。
database.force.deny.writing 布尔 是否强制指定的数据库拒绝写操作。
database.force.deny.reading 布尔 是否强制指定的数据库拒绝读取操作。
timezone 字符串 指定应用于数据库内时间敏感操作的默认时区,尤其是TIMESTAMPTZ 字段。除非设置了集合级时区,否则集合将继承数据库时区。查询级时区参数可暂时覆盖数据库和 Collections 的默认时区。其值必须是有效的IANA 时区标识符(例如,亚洲/上海美国/芝加哥UTC)。有关如何使用TIMESTAMPTZ 字段的详细信息,请参阅TIMESTAMPTZ 字段

更改数据库属性

export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/databases/alter" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "dbName": "my_database",
    "properties": {
        "database.max.collections": 10
    }
}'

删除数据库属性

  • 您还可以通过如下方式删除数据库属性来重置该属性。下面的示例删除了可以在数据库中创建的 Collection 数量限制。
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/databases/alter" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "dbName": "my_database",
    "propertyKeys": [
        "database.max.collections"
    ]
}'

FAQ for 数据库

如何管理数据库的权限?

Milvus 使用基于角色的访问控制(RBAC)来管理权限。您可以创建具有特定权限的角色,并将其分配给用户,从而控制他们对不同数据库的访问。有关详细信息,请参阅RBAC 文档

数据库有配额限制吗?

是的,Milvus 允许您为数据库设置配额限制,如收藏的最大数量。有关限制的全面列表,请参阅Milvus 限制文档

2.3 Collections/集合

Collection

  • 在 Milvus 上,您可以创建多个 Collections 来管理数据,并将数据作为实体插入到 Collections 中。Collections 和实体类似于关系数据库中的表和记录。本页将帮助你了解 Collection 及其相关概念。

  • Collection 是一个二维表,具有固定的列和变化的行。每列代表一个字段,每行代表一个实体。

下图显示了一个有 8 列和 6 个实体的 Collection:

image

Schema 和字段

  • 在描述一个对象时,我们通常会提到它的属性,如大小、重量和位置。您可以将这些属性用作 Collection 中的字段。每个字段都有各种约束属性,例如向量字段的数据类型和维度。通过创建字段并定义其顺序,可以形成一个 Collections Schema。有关可能适用的数据类型,请参阅Schema 解释

您应在要插入的实体中包含所有 Schema 定义的字段。要使其中一些字段可选,可考虑启用动态字段。有关详情,请参阅动态字段。

  • 使其为空或设置默认值

    有关如何使字段无效或设置默认值的详细信息,请参阅无效和默认

  • 启用动态字段

    有关如何启用和使用动态字段的详细信息,请参阅动态字段。

主键和 AutoId

  • 与关系数据库中的主键字段类似,Collection 也有一个主键字段,用于将实体与其他实体区分开来。
    • 主键字段中的每个值都是全局唯一的,并与一个特定的实体相对应。

如上图所示,名为id的字段是主字段,第一个 ID0对应一个名为 "冠状病毒的死亡率并不重要"的实体。不会有其他实体的主字段为 0。

  • 主键字段只接受整数字符串
    • 插入实体时,默认情况下应包含主字段值。
    • 但是,如果在创建 Collections 时启用了AutoId,Milvus 将在插入数据时自动生成这些值。在这种情况下,请从要插入的实体中排除主字段值。

有关详细信息,请参阅 "主键字段和自动标识"。

索引

  • 为特定字段创建索引可提高搜索效率。建议您为服务所依赖的所有字段创建索引,其中必须为向量字段创建索引。

实体

  • 实体是指在 Collections 中共享同一组字段的数据记录。同一行中所有字段的值构成一个实体

  • 您可以根据需要在 Collections 中插入任意数量的实体。但是,随着实体数量的增加,所占用的内存大小也会增加,从而影响搜索性能。

有关详细信息,请参阅Schema Explained

加载和释放

  • 加载集合是在集合中进行相似性搜索和查询的前提。加载 Collections 时,Milvus 会将所有索引文件和每个字段中的原始数据加载到内存中,以便快速响应搜索和查询。

  • 搜索和查询是内存密集型操作。为节约成本,建议您释放当前不使用的 Collections

加载 Collections 时,Milvus 会将索引文件、所有或特定字段的原始数据加载到内存中,以便快速响应搜索和查询。在载入 Collections 后插入的实体会自动编入索引并载入。

有关详细信息,请参阅加载和释放

搜索和查询

创建索引并加载 Collections 后,就可以通过输入一个或多个查询向量开始相似性搜索。例如,当接收到搜索请求中携带的查询向量表示时,Milvus 会使用指定的度量类型来衡量查询向量与目标 Collections 中的向量之间的相似性,然后再返回与查询语义相似的向量。

你还可以在搜索和查询中加入元数据过滤功能,以提高搜索结果的相关性。请注意,元数据过滤条件在查询中是强制性的,但在搜索中是可选的。

有关适用度量类型的详细信息,请参阅度量类型

有关搜索和查询的更多信息,请参阅搜索和 Rerankers 章节中的文章,其中包括基本功能:

此外,Milvus 还提供了提高搜索性能和效率的增强功能。这些增强功能默认为禁用,您可以根据自己的服务要求启用和使用它们。它们是

分区

  • 分区是集合的子集,与其父集合共享相同的字段集,每个分区包含一个实体子集。

通过将实体分配到不同的分区,可以创建实体组。你可以在特定分区中进行搜索和查询,让 Milvus 忽略其他分区中的实体,提高搜索效率。

有关详情,请参阅管理分区

  • 分区是 Collections 的水平切片。每个分区对应一个数据输入通道。每个 Collections 默认都有一个分区。创建 Collections 时,可以根据预期吞吐量和要插入 Collections 的数据量设置适当的分区数量。

有关如何设置分片数的详细信息,请参阅创建 Collections

别名

您可以为您的集合创建别名。

一个集合可以有多个别名,但集合不能共享一个别名

收到针对某个 Collection 的请求后,Milvus 会根据所提供的名称定位该 Collection。如果所提供名称的 Collection 不存在,Milvus 会继续定位所提供名称的别名。

你可以使用 Collections 别名来调整代码以适应不同的情况。

更多详情,请参阅管理别名

函数

  • 您可以为 Milvus 设置函数,以便在创建 Collections 时派生字段。
  • 例如,全文搜索功能使用用户定义函数从特定 varchar 字段推导出稀疏向量字段。有关全文搜索的更多信息,请参阅全文搜索

一致性级别

  • 分布式数据库系统通常使用一致性级别来定义跨数据节点和副本的数据相同性。

  • 在创建 Collections 或在 Collections 中进行相似性搜索时,可以分别设置不同的一致性级别。适用的一致性级别有强有限制的不稳定性会话最终

有关这些一致性级别的详细信息,请参阅一致性级别。

3 使用指南 for Restful API/curl

  • Milvus 提供 RESTful API,方便你操作收藏和存储在其中的数据。

此处整理了基于 Milvus 19530 业务端口 的常用 curl 命令清单,覆盖集合管理、数据操作、向量检索等核心场景,所有命令均可直接复制使用(默认 Milvus 部署在 localhost,开启默认认证 root/milvus)。
这些API端点涉及操作指定集群中的集合以及特定集合中的数据。
API端点的前缀应始终是你Milvus实例的URI,例如。localhost:19530

  • 如下示例,基于 milvus 2.5.21

前置说明

  1. 所有命令的基础路径:http://localhost:19530/v1/vector
  2. 认证方式:默认使用 Basic Auth(用户名:密码 = root:milvus),已内置在命令中
USER=root
PASSWORD=Milvus
CLUSTER_ENDPOINT="http://127.0.0.1:19530"
  1. 核心 Header:Content-Type: application/json 必须携带
  2. 替换说明:将命令中的 <集合名>/<向量数据> 替换为你的实际值即可

API 端点版本管理

  • Milvus 提供两组 API 端点,分别是 v1v2
  • v1端点仅涵盖收集和矢量操作;
  • v2端点则涵盖更多操作,如索引管理、分区管理和基于角色的访问控制(RBAC)操作。
    v1端点将在不久的将来被弃用,而推荐使用的是v2端点。
  • v1 API

https://milvus.io/api-reference/restful/v2.5.x/v1/Collection (v1)/Create.md

  • v2 API

数据库管理(v2)

$ curl --request POST \
    --url "${CLUSTER_ENDPOINT}/v2/vectordb/databases/list" \
    --header 'accept: application/json' \
    --header 'content-type: application/json' \
    -H "Authorization: Basic $(echo -n "${USER}:${PASSWORD}" | base64)" \
    -d '{}'
{"code":0,"data":["default"]}

集合管理(v2)

1. 列出所有集合

https://milvus.io/api-reference/restful/v2.5.x/About.md

# curl --request POST \
    --url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/list" \
    --header 'accept: application/json' \
    --header 'content-type: application/json' \
    -H "Authorization: Basic $(echo -n "${USER}:${PASSWORD}" | base64)" \
    -d '{
        "dbName": "default"
    }'

out

{"code":0,"data":["test_collection2","test_collection"]}

2. 创建集合

  • API

https://milvus.io/api-reference/restful/v2.5.x/v2/Collection (v2)/Create.md

  • 示例:2维向量集合
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Basic $(echo -n "${USER}:${PASSWORD}" | base64)" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "test_collection3",
    "dimension": 5
}'


> out:
{"code":0,"data":{}}

3. 查询指定集合的描述信息

$ curl --request POST \
    --url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/describe" \
    --header 'accept: application/json' \
    --header 'content-type: application/json' \
    -H "Authorization: Basic $(echo -n "${USER}:${PASSWORD}" | base64)" \
        -d '{
                "collectionName": "test_collection"
        }'

> out:
{"code":0,"data":{"aliases":[],"autoId":false,"collectionID":465065208250116136,"collectionName":"test_collection","consistencyLevel":"Bounded","description":"","enableDyna
micField":true,"fields":[{"autoId":false,"clusteringKey":false,"description":"","id":100,"name":"id","nullable":false,"partitionKey":false,"primaryKey":true,"type":"Int64"}
,{"autoId":false,"clusteringKey":false,"description":"","id":101,"name":"vector","nullable":false,"params":[{"key":"dim","value":"128"}],"partitionKey":false,"primaryKey":f
alse,"type":"FloatVector"}],"functions":[],"indexes":[{"fieldName":"vector","indexName":"vector","metricType":"COSINE"}],"load":"LoadStateLoaded","partitionsNum":1,"propert
ies":[],"shardsNum":1},"message":""}

4. 删除集合

  • API

https://milvus.io/api-reference/restful/v2.5.x/v2/Collection (v2)/Drop.md

$ curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/drop" \
--header "Authorization: Basic $(echo -n "${USER}:${PASSWORD}" | base64)" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "test_collection3"
}'


> out:
{"code":0,"data":{}}

向量数据操作(插入/查询/删除)(v2)

1. 插入向量数据

  • API

https://milvus.io/api-reference/restful/v2.5.x/v2/Vector (v2)/Insert.md

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \
--header "Authorization: Basic $(echo -n "${USER}:${PASSWORD}" | base64)" \
--header "Content-Type: application/json" \
-d '{
    "data": [
        {
            "id": 0,
            "vector": [
                0.3580376395471989,
                -0.6023495712049978,
                0.18414012509913835,
                -0.26286205330961354,
                0.9029438446296592
            ],
            "color": "pink_8682"
        },
        {
            "id": 1,
            "vector": [
                0.19886812562848388,
                0.06023560599112088,
                0.6976963061752597,
                0.2614474506242501,
                0.838729485096104
            ],
            "color": "red_7025"
        },
        {
            "id": 2,
            "vector": [
                0.43742130801983836,
                -0.5597502546264526,
                0.6457887650909682,
                0.7894058910881185,
                0.20785793220625592
            ],
            "color": "orange_6781"
        },
        {
            "id": 3,
            "vector": [
                0.3172005263489739,
                0.9719044792798428,
                -0.36981146090600725,
                -0.4860894583077995,
                0.95791889146345
            ],
            "color": "pink_9298"
        },
        {
            "id": 4,
            "vector": [
                0.4452349528804562,
                -0.8757026943054742,
                0.8220779437047674,
                0.46406290649483184,
                0.30337481143159106
            ],
            "color": "red_4794"
        },
        {
            "id": 5,
            "vector": [
                0.985825131989184,
                -0.8144651566660419,
                0.6299267002202009,
                0.1206906911183383,
                -0.1446277761879955
            ],
            "color": "yellow_4222"
        },
        {
            "id": 6,
            "vector": [
                0.8371977790571115,
                -0.015764369584852833,
                -0.31062937026679327,
                -0.562666951622192,
                -0.8984947637863987
            ],
            "color": "red_9392"
        },
        {
            "id": 7,
            "vector": [
                -0.33445148015177995,
                -0.2567135004164067,
                0.8987539745369246,
                0.9402995886420709,
                0.5378064918413052
            ],
            "color": "grey_8510"
        },
        {
            "id": 8,
            "vector": [
                0.39524717779832685,
                0.4000257286739164,
                -0.5890507376891594,
                -0.8650502298996872,
                -0.6140360785406336
            ],
            "color": "white_9381"
        },
        {
            "id": 9,
            "vector": [
                0.5718280481994695,
                0.24070317428066512,
                -0.3737913482606834,
                -0.06726932177492717,
                -0.6980531615588608
            ],
            "color": "purple_4976"
        }
    ],
    "collectionName": "test_collection4"
}'

out

{"code":0,"cost":0,"data":{"insertCount":10,"insertIds":[0,1,2,3,4,5,6,7,8,9]}}

2. 向量检索(最核心操作)

  • v2 API

https://milvus.io/api-reference/restful/v2.5.x/v2/Vector (v2)/Query.md

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Basic $(echo -n "${USER}:${PASSWORD}" | base64)" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "test_collection4",
    "filter": "color like \"red_%\"",
    "outputFields": [
        "color"
    ],
    "limit": 3
}'

out

{"code":0,"cost":0,"data":[{"color":"red_7025","id":1},{"color":"red_4794","id":4},{"color":"red_9392","id":6}]}
  • v1 API (未亲测)

https://milvus.io/api-reference/restful/v2.5.x/v1/Vector (v1)/Query.md

curl -X POST "http://localhost:19530/v1/vector/search" \
  -H "Authorization: Basic $(echo -n 'root:milvus' | base64)" \
  -H "Content-Type: application/json" \
  -d '{
    "collection_name": "my_vector_collection",
    "vector": [0.15, 0.25],
    "topk": 2,
    "metric_type": "L2"
  }'
  • topk:返回最相似的前 N 个结果
  • vector:检索的目标向量(维度需与集合一致)

3. 删除指定 ID 的向量数据

  • v2 API

https://milvus.io/api-reference/restful/v2.5.x/v2/Vector (v2)/Delete.md

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete" \
--header "Authorization: Basic $(echo -n "${USER}:${PASSWORD}" | base64)" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "medium_articles",
    "filter": "id == 4321034832910"
}'
  • v1 API (未亲测)
curl -X DELETE "http://localhost:19530/v1/vector/delete" \
  -H "Authorization: Basic $(echo -n 'root:milvus' | base64)" \
  -H "Content-Type: application/json" \
  -d '{
    "collection_name": "my_vector_collection",
    "ids": [1, 2]
  }'

索引管理(提升检索性能)

1. 为集合创建索引

  • v2 API

这为目标场创建一个命名的索引,目标场可以是矢量场或标量场。
https://milvus.io/api-reference/restful/v2.5.x/v2/Index (v2)/Create.md

export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/indexes/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "custom_setup_not_indexed",
    "indexParams": [
        {
            "index_type": "AUTOINDEX",
            "metricType": "L2",
            "fieldName": "my_vector",
            "indexName": "my_vector"
        }
    ]
}'

2. 查询集合索引信息

  • v2 API

https://milvus.io/api-reference/restful/v2.5.x/v2/Index (v2)/Listes.md

export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/indexes/list" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "test_collection"
}'

总结

  1. 19530 端口是 Milvus 业务核心入口,所有数据操作/集合管理都应通过该端口完成,命令基础路径为 /v1/vector/*
  2. 所有命令均需携带 Basic Auth 认证头(root:milvus 为默认),生产环境需修改默认密码;
  3. 核心场景优先级:创建集合 → 插入向量 → 创建索引 → 向量检索,按此流程可快速完成基础向量检索任务。

4 使用指南 for Python

依赖包

pip install pymilvus

Milvus WebUI

简述

  • Milvus Web UIMilvus图形化管理工具

它以简单直观的界面增强了系统的可观察性。
您可以使用 Milvus Web UI 观察 Milvus 组件和依赖关系的统计和指标,检查数据库和 Collections 的详细信息,并列出详细的 Milvus 配置。

  • Milvus Web UIBirdwatcherAttu 不同,它是一个内置工具,以简单直观的界面提供整体系统可观察性。

Milvus Web UI 和 Birdwatcher/Attu 的功能比较:

功能 Milvus 网络用户界面 Birdwatcher Attu
操作符 图形用户界面 CLI 图形用户界面
目标用户 维护人员、开发人员 维护人员 开发人员
安装 内置 独立工具 独立工具
依赖关系 Milvus Milvus / etcd Milvus
主要功能 运行环境、数据库/ Collections 详情、段、通道、任务和慢查询请求 元数据检查和 Milvus API 执行 数据库管理和操作任务
v2.5.0 v2.0.0 v0.1.8

从 v2.5.0 起,你可以在运行中的 Milvus 实例上使用以下 URL 访问 Milvus Web UI:

http://${MILVUS_PROXY_IP}:9091/webui

连接

建立连接

from pymilvus import connections

connection = connections.connect(
  alias="default", # 连接的别名
  user='username',
  password='password',
  host='localhost', # 数据库服务器的主机名或 IP 地址。
  port='19530'
)

关闭连接

connections.disconnect("default")

F 扩展

F.1 Java 集成 Milvus

  • Java 集成 Milvus
  • 要求
  • Java(8 或更高版本)
  • Apache Maven 或 Gradle/Grails
  • Maven 依赖坐标
<!-- Milvus SDK Java : Milvus Java SDK core functions, https://mvnrepository.com/artifact/io.milvus/milvus-sdk-java -->
<dependency>
	<groupId>io.milvus</groupId>
	<artifactId>milvus-sdk-java</artifactId>
	<version>2.5.15</version>
</dependency>

F.2 Python 集成 Milvus

  • Python集成Milvus

Y 推荐文献

  • Milvus

X 参考文献

posted @ 2026-03-21 21:01  千千寰宇  阅读(391)  评论(0)    收藏  举报