目录
可以理解为成一个关系表,只是支持了一个向量类型字段。
1 介绍
官网文档:https://milvus.io/docs/zh
业界排名:https://db-engines.com/en/ranking/vector+dbms

2 竞品对比
为了对 Milvus 和 Pinecone 这两个向量数据库解决方案进行比较,下表突出了各种功能之间的差异。
| 特征 | Pinecone | Milvus | 备注 |
|---|---|---|---|
| 部署模式 | 纯 SaaS | Milvus Lite、On-prem Standalone & Cluster、Zilliz Cloud Saas & BYOC | Milvus 提供更灵活的部署模式。 |
| 支持的 SDK | Python、JavaScript/TypeScript | Python、Java、NodeJS、Go、Restful API、C#、Rust | Milvus 支持更广泛的编程语言。 |
| 开源状态 | 已关闭 | 开源 | Milvus 是一个流行的开源向量数据库。 |
| 可扩展性 | 仅向上/向下扩展 | 向外/向内扩展和向上/向下扩展 | Milvus 采用分布式架构,增强了可扩展性。 |
| 可用性 | 可用区域内基于 Pod 的架构 | 可用区域故障切换和跨区域 HA | Milvus CDC(变更数据捕获)支持主备模式,以提高可用性。 |
| 性能成本(每百万次查询收费) | 中型数据集 0.178 美元起,大型数据集 1.222 美元起 | Zilliz Cloud 中型数据集的起价为 0.148 美元,大型数据集的起价为 0.635 美元;提供免费版本 | 请参阅成本排名报告。 |
| GPU 加速 | 不支持 | 支持英伟达™(NVIDIA®)GPU | GPU 加速可大幅提升性能,通常可提升几个数量级。 |
3 非结构化、Embedings和Milvus 关系
文本、图像和音频等非结构化数据格式各异,并带有丰富的底层语义,因此分析起来极具挑战性。为了处理这种复杂性,Embeddings 被用来将非结构化数据转换成能够捕捉其基本特征的数字向量。然后将这些向量存储在向量数据库中,从而实现快速、可扩展的搜索和分析。
- Embedings将非结构化数据进行向量化
- Milvus:将Embedings生成的向量进行保存

Milvus 提供三种部署模式,涵盖各种数据规模–从 Jupyter Notebooks 中的本地原型到管理数百亿向量的大规模 Kubernetes 集群:
- Milvus Lite 是一个 Python 库,可以轻松集成到您的应用程序中。作为 Milvus 的轻量级版本,它非常适合在 Jupyter Notebooks 中进行快速原型开发,或在资源有限的边缘设备上运行。了解更多信息。
- Milvus Standalone 是单机服务器部署,所有组件都捆绑在一个 Docker 镜像中,方便部署。了解更多。
- Milvus Distributed 可部署在 Kubernetes 集群上,采用云原生架构,专为十亿规模甚至更大的场景而设计。该架构可确保关键组件的冗余。
4 流程
来源: https://milvus.io/docs/zh/dense-vector.md
稠密向量可使用各种嵌入模型生成,如用于图像的 CNN 模型(如ResNet、VGG)和用于文本的语言模型(如BERT、Word2Vec)。这些模型将原始数据转化为高维空间中的点,捕捉数据的语义特征。此外,Milvus 还提供便捷的方法,帮助用户生成和处理密集向量,详见 Embeddings。
一旦数据被向量化,就可以存储在 Milvus 中进行管理和向量检索。下图显示了基本流程。

4.1 添加向量字段
要在 Milvus 中使用密集向量,首先要在创建 Collections 时定义一个用于存储密集向量的向量场。这个过程包括
- 将datatype 设置为受支持的密集向量数据类型。有关支持的密集向量数据类型,请参阅数据类型。
- 使用dim 参数指定密集向量的维数。
在下面的示例中,我们添加了一个名为dense_vector 的向量字段来存储密集向量。字段的数据类型为FLOAT_VECTOR ,维数为4 。
|
1 2 3 4 5 6 7 8 9 10 11 |
from pymilvus import MilvusClient, DataType client = MilvusClient(uri="http://localhost:19530") schema = client.create_schema( auto_id=True, enable_dynamic_fields=True, ) schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100) schema.add_field(field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=4) |
4.2 为向量场设置索引参数
为了加速语义搜索,必须为向量场创建索引。索引可以大大提高大规模向量数据的检索效率。
|
1 2 3 4 5 6 7 8 9 |
index_params = client.prepare_index_params() index_params.add_index( field_name="dense_vector", index_name="dense_vector_index", index_type="IVF_FLAT", metric_type="IP", params={"nlist": 128} ) |
在上面的示例中,使用IVF_FLAT 索引类型为dense_vector 字段创建了名为dense_vector_index 的索引。metric_type 设置为IP ,表示将使用内积作为距离度量。
Milvus 还支持其他索引类型。更多详情,请参阅浮动向量索引。此外,Milvus 还支持其他度量类型。更多信息,请参阅 “度量类型“。
4.3 通过Schema和Index来创建Collections
完成密集向量和索引参数设置后,就可以创建包含密集向量的 Collections。下面的示例使用create_collection 方法创建了一个名为my_dense_collection 的集合。
|
1 2 3 4 5 |
client.create_collection( collection_name="my_dense_collection", schema=schema, index_params=index_params ) |
4.4 插入数据
创建集合后,使用insert 方法添加包含密集向量的数据。确保插入的密集向量的维度与添加密集向量字段时定义的dim 值相匹配。
|
1 2 3 4 5 6 7 8 9 |
data = [ {"dense_vector": [0.1, 0.2, 0.3, 0.7]}, {"dense_vector": [0.2, 0.3, 0.4, 0.8]}, ] client.insert( collection_name="my_dense_collection", data=data ) |
4.5 执行相似查询
基于密集向量的语义搜索是 Milvus 的核心功能之一,可以根据向量之间的距离快速找到与查询向量最相似的数据。要执行相似性搜索,请准备好查询向量和搜索参数,然后调用search 方法。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
search_params = { "params": {"nprobe": 10} } query_vector = [0.1, 0.2, 0.3, 0.7] res = client.search( collection_name="my_dense_collection", data=[query_vector], anns_field="dense_vector", search_params=search_params, limit=5, output_fields=["pk"] ) print(res) # Output # data: ["[{'id': '453718927992172271', 'distance': 0.7599999904632568, 'entity': {'pk': '453718927992172271'}}, {'id': '453718927992172270', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172270'}}]"] |
5 部署
1. 下载docker https://www.docker.com/products/docker-desktop/
2. 新建 ~/milvs目录
3. 在docker部署milvs:https://milvus.io/docs/install_standalone-docker.md
|
1 2 3 |
curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh bash standalone_embed.sh start |
4. 查看

5. 测试






