开源向量数据库横评:Milvus vs Qdrant vs Weaviate
向量数据库是AI时代的基础设施,是构建RAG应用、语义搜索、推荐系统的核心组件。当前开源社区涌现了多个优秀的向量数据库,其中 Milvus、Qdrant 和 Weaviate 是最主流的三大选择。本文将从架构、性能、易用性等多个维度进行全面横评。
三大数据库概览
Milvus
Milvus 由 Zilliz 团队开发,是目前 GitHub Star 数最多的向量数据库。它采用云原生架构,支持水平扩展,专为十亿级向量规模设计。
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 编写,以高性能和低资源占用著称,同时内置了丰富的过滤功能。
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 不仅是一个向量数据库,还内置了模块化的向量化能力,可以直接对接多种嵌入模型。
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. 索引算法支持
# 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. 过滤能力
向量搜索常常需要结合元数据过滤。三者都支持预过滤和后过滤:
# 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 都支持向量与关键词的混合搜索:
# 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 快速部署
# Qdrant - 最简单
services:
qdrant:
image: qdrant/qdrant:latest
ports: ["6333:6333", "6334:6334"]
volumes: ["./data:/qdrant/storage"]
# Milvus - 需要 etcd + MinIO
# docker-compose 文件包含 5+ 个容器运维复杂度
选型建议
选择 Milvus 的场景
选择 Qdrant 的场景
选择 Weaviate 的场景
总结对比表
| 维度 | Milvus | Qdrant | Weaviate |
|------|--------|--------|----------|
| 最大规模 | 10亿+ | 10亿 | 数亿 |
| 查询性能 | 优秀 | 最佳 | 良好 |
| 部署难度 | 高 | 低 | 中 |
| 过滤能力 | 良好 | 最佳 | 优秀 |
| 混合搜索 | 支持 | 社区版有限 | 原生支持 |
| 内置向量化 | 否 | 否 | 是 |
| 云原生 | 是 | 部分 | 部分 |
向量数据库的选型取决于你的具体需求。对于大多数中小型RAG应用,Qdrant 是性价比最高的选择;对于大规模企业级应用,Milvus 的分布式架构更可靠;如果你希望减少向量化环节的工程量,Weaviate 的模块化设计能帮你省去不少工作。建议在实际选型前,用你的真实数据做一轮基准测试,用数据说话。
💬 评论区 (0)
暂无评论,快来抢沙发吧!