开源向量数据库横评:Milvus vs Qdrant vs Weaviate

开源向量数据库横评:Milvus vs Qdrant vs Weaviate

向量数据库是AI时代的基础设施,是构建RAG应用、语义搜索、推荐系统的核心组件。当前开源社区涌现了多个优秀的向量数据库,其中 MilvusQdrantWeaviate 是最主流的三大选择。本文将从架构、性能、易用性等多个维度进行全面横评。

三大数据库概览

Milvus

Milvus 由 Zilliz 团队开发,是目前 GitHub Star 数最多的向量数据库。它采用云原生架构,支持水平扩展,专为十亿级向量规模设计。

python
from pymilvus import MilvusClient

client = MilvusClient(uri="http://localhost:19530")

# 创建集合
client.create_collection(
    collection_name="documents",
    dimension=1536,
    metric_type="COSINE",
)

# 插入数据
client.insert(
    collection_name="documents",
    data=[
        {"id": 1, "vector": [0.1]*1536, "text": "机器学习入门", "category": "AI"},
        {"id": 2, "vector": [0.2]*1536, "text": "深度学习实践", "category": "AI"},
    ],
)

# 向量搜索
results = client.search(
    collection_name="documents",
    data=[0.15]*1536,
    limit=5,
    output_fields=["text", "category"],
    filter='category == "AI"',
)

Qdrant

Qdrant 用 Rust 编写,以高性能和低资源占用著称,同时内置了丰富的过滤功能。

python
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct, Filter, FieldCondition, MatchValue

client = QdrantClient(url="http://localhost:6333")

client.create_collection(
    collection_name="documents",
    vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
)

client.upsert(
    collection_name="documents",
    points=[
        PointStruct(id=1, vector=[0.1]*1536, payload={"text": "机器学习", "category": "AI"}),
        PointStruct(id=2, vector=[0.2]*1536, payload={"text": "深度学习", "category": "AI"}),
    ],
)

# 带过滤条件的搜索
results = client.search(
    collection_name="documents",
    query_vector=[0.15]*1536,
    limit=5,
    query_filter=Filter(
        must=[FieldCondition(key="category", match=MatchValue(value="AI"))]
    ),
)

Weaviate

Weaviate 不仅是一个向量数据库,还内置了模块化的向量化能力,可以直接对接多种嵌入模型。

python
import weaviate

client = weaviate.connect_to_local()

# 创建 Schema
documents = client.collections.create(
    name="Document",
    vectorizer_config=weaviate.Configure.Vectorizer.text2vec_transformers(),
    properties=[
        weaviate.Property(name="text", data_type=weaviate.DataType.TEXT),
        weaviate.Property(name="category", data_type=weaviate.DataType.TEXT),
    ],
)

# 插入数据(自动向量化)
with documents.batch.dynamic() as batch:
    batch.add_object(
        properties={"text": "机器学习入门指南", "category": "AI"},
    )

# 搜索
results = documents.query.near_text(
    query="什么是机器学习",
    limit=5,
    filters=weaviate.Filter.by_property("category").equal("AI"),
)

核心维度对比

1. 架构设计

| 特性 | Milvus | Qdrant | Weaviate |
|------|--------|--------|----------|
| 开发语言 | Go/C++ | Rust | Go |
| 架构风格 | 云原生微服务 | 单体轻量 | 模块化单体 |
| 存储后端 | 可插拔(S3/MinIO) | 内置RocksDB | 内置 |
| 分布式 | 原生支持 | 集群分片 | 集群支持 |

Milvus 的云原生架构使其在大规模部署时具有天然优势,但也带来了较高的运维复杂度。Qdrant 的单体设计则更简单轻量。

2. 性能表现

基于百万级向量数据集的基准测试结果:

| 指标 | Milvus | Qdrant | Weaviate |
|------|--------|--------|----------|
| 写入吞吐 | 高 | 最高 | 中等 |
| 查询延迟(P99) | ~15ms | ~5ms | ~20ms |
| 召回率(ANN) | 99%+ | 99%+ | 98%+ |
| 内存占用 | 高 | 低 | 中等 |

Qdrant 在写入吞吐和查询延迟方面表现最为突出,这得益于 Rust 语言的零开销抽象特性。

3. 索引算法支持

python
# Milvus: 支持多种索引类型
index_params = {
    "index_type": "HNSW",
    "metric_type": "COSINE",
    "params": {"M": 16, "efConstruction": 256},
}
# 也支持 IVF_FLAT, IVF_SQ8, DISKANN 等

# Qdrant: HNSW 为主,支持量化
client.update_collection(
    collection_name="documents",
    hnsw_config={"m": 16, "ef_construct": 256},
    quantization_config={"scalar": {"type": "int8", "quantile": 0.99}},
)

# Weaviate: HNSW 内置,支持 BQ/PQ 量化

4. 过滤能力

向量搜索常常需要结合元数据过滤。三者都支持预过滤和后过滤:

python
# Qdrant 的过滤最为强大,支持嵌套条件
from qdrant_client.models import Filter, FieldCondition, Range

complex_filter = Filter(
    must=[
        FieldCondition(key="category", match=MatchValue(value="AI")),
        FieldCondition(key="score", range=Range(gte=0.8, lte=1.0)),
    ],
    should=[
        FieldCondition(key="language", match=MatchValue(value="zh")),
    ],
)

5. 混合搜索

Weaviate 和 Milvus 都支持向量与关键词的混合搜索:

python
# Weaviate 混合搜索
results = collection.query.hybrid(
    query="机器学习算法",
    alpha=0.5,  # 0=纯关键词, 1=纯向量
    limit=10,
)

# Milvus 2.4+ 混合搜索
from pymilvus import AnnSearchRequest, WeightedRanker
req1 = AnnSearchRequest(data=[vec], anns_field="vector", param={})
req2 = AnnSearchRequest(data=[sparse_vec], anns_field="sparse_vector", param={})
results = client.hybrid_search(
    collection_name="docs",
    reqs=[req1, req2],
    ranker=WeightedRanker(0.7, 0.3),
    limit=10,
)

部署与运维

Docker 快速部署

yaml
# Qdrant - 最简单
services:
  qdrant:
    image: qdrant/qdrant:latest
    ports: ["6333:6333", "6334:6334"]
    volumes: ["./data:/qdrant/storage"]

# Milvus - 需要 etcd + MinIO
# docker-compose 文件包含 5+ 个容器

运维复杂度


  • Milvus:最高,需要维护 etcd、MinIO、Pulsar 等依赖组件

  • Qdrant:最低,单二进制即可运行,也支持分布式

  • Weaviate:中等,单容器可运行,但功能完整版需要配置向量化模块
  • 选型建议

    选择 Milvus 的场景


  • 向量规模达到十亿级别

  • 需要云原生架构和水平扩展

  • 团队有较强的运维能力

  • 需要多副本和高可用
  • 选择 Qdrant 的场景


  • 中小规模向量数据(百万~千万级)

  • 追求极致性能和低延迟

  • 运维资源有限,偏好简单部署

  • 需要强大的元数据过滤
  • 选择 Weaviate 的场景


  • 需要内置向量化能力(不想自己管理 Embedding)

  • 构建知识图谱应用

  • 需要开箱即用的混合搜索

  • 偏好 GraphQL API 风格
  • 总结对比表

    | 维度 | Milvus | Qdrant | Weaviate |
    |------|--------|--------|----------|
    | 最大规模 | 10亿+ | 10亿 | 数亿 |
    | 查询性能 | 优秀 | 最佳 | 良好 |
    | 部署难度 | 高 | 低 | 中 |
    | 过滤能力 | 良好 | 最佳 | 优秀 |
    | 混合搜索 | 支持 | 社区版有限 | 原生支持 |
    | 内置向量化 | 否 | 否 | 是 |
    | 云原生 | 是 | 部分 | 部分 |

    向量数据库的选型取决于你的具体需求。对于大多数中小型RAG应用,Qdrant 是性价比最高的选择;对于大规模企业级应用,Milvus 的分布式架构更可靠;如果你希望减少向量化环节的工程量,Weaviate 的模块化设计能帮你省去不少工作。建议在实际选型前,用你的真实数据做一轮基准测试,用数据说话。

    💬 评论区 (0)

    暂无评论,快来抢沙发吧!