Qdrant
→ 返回 向量数据库
Qdrant 是用 Rust 编写的开源向量数据库,以高性能、低内存占用和丰富的过滤能力著称,提供 REST API 和多语言 SDK,同时也有托管云服务。
与同类对比
| 维度 | Qdrant | Milvus | Pinecone |
|---|---|---|---|
| 实现语言 | Rust | Go | 闭源 |
| 部署方式 | 自建 / 云托管 | 自建 | 云托管 |
| 内存占用 | 极低 | 中等 | 托管无需关心 |
| 过滤能力 | 丰富,支持嵌套条件 | 基础 | 基础 |
| 混合搜索 | 支持(稠密 + 稀疏) | 支持 | 支持 |
| 适用场景 | 资源受限、复杂过滤 | 超大规模 | 快速原型 |
核心概念
| 概念 | 说明 |
|---|---|
| Collection | 向量集合,类似表 |
| Point | 一条记录,包含 id、vector、payload |
| Payload | 随向量存储的 JSON 元数据,用于过滤 |
| Segment | Collection 内部的存储分段 |
部署
# Docker 单机部署
docker run -p 6333:6333 -p 6334:6334 \
-v $(pwd)/qdrant_storage:/qdrant/storage \
qdrant/qdrant
# REST API 端口:6333
# gRPC 端口:6334Python SDK 示例
初始化与创建 Collection
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams
client = QdrantClient(host="localhost", port=6333)
client.create_collection(
collection_name="documents",
vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
)写入 Points
from qdrant_client.models import PointStruct
points = [
PointStruct(
id=1,
vector=get_embedding("向量数据库简介..."),
payload={
"content": "向量数据库简介...",
"source": "doc_001",
"category": "database"
}
)
]
client.upsert(collection_name="documents", points=points)相似度搜索
results = client.search(
collection_name="documents",
query_vector=get_embedding("什么是向量数据库?"),
limit=5,
with_payload=True
)
for hit in results:
print(f"score: {hit.score:.4f} content: {hit.payload['content']}")带过滤的搜索
from qdrant_client.models import Filter, FieldCondition, MatchValue, Range
# 精确匹配
results = client.search(
collection_name="documents",
query_vector=query_vec,
query_filter=Filter(
must=[FieldCondition(key="source", match=MatchValue(value="doc_001"))]
),
limit=5
)
# 多条件 AND
results = client.search(
collection_name="documents",
query_vector=query_vec,
query_filter=Filter(
must=[
FieldCondition(key="category", match=MatchValue(value="database")),
FieldCondition(key="score", range=Range(gte=0.8))
]
),
limit=5
)删除
from qdrant_client.models import PointIdsList, FilterSelector
# 按 ID 删除
client.delete(
collection_name="documents",
points_selector=PointIdsList(points=[1, 2, 3])
)
# 按 payload 过滤删除
client.delete(
collection_name="documents",
points_selector=FilterSelector(
filter=Filter(
must=[FieldCondition(key="source", match=MatchValue(value="old_doc"))]
)
)
)混合搜索(稠密 + 稀疏向量)
Qdrant 支持同时使用稠密向量(语义搜索)和稀疏向量(关键词匹配),通过 RRF 融合排名:
from qdrant_client.models import SparseVectorParams, FusionQuery, Fusion
# 创建支持混合搜索的 Collection
client.create_collection(
collection_name="hybrid_docs",
vectors_config={"dense": VectorParams(size=1536, distance=Distance.COSINE)},
sparse_vectors_config={"sparse": SparseVectorParams()}
)
# 混合查询
results = client.query_points(
collection_name="hybrid_docs",
prefetch=[
{"query": dense_vec, "using": "dense", "limit": 20},
{"query": sparse_vec, "using": "sparse", "limit": 20}
],
query=FusionQuery(fusion=Fusion.RRF),
limit=5
)Payload 索引(加速过滤)
对高频过滤字段建索引,大幅提升过滤性能:
from qdrant_client.models import PayloadSchemaType
client.create_payload_index(
collection_name="documents",
field_name="category",
field_schema=PayloadSchemaType.KEYWORD
)
client.create_payload_index(
collection_name="documents",
field_name="created_at",
field_schema=PayloadSchemaType.DATETIME
)Spring AI 集成
spring:
ai:
vectorstore:
qdrant:
host: localhost
port: 6334
collection-name: documents
use-tls: false@Service
@RequiredArgsConstructor
public class SearchService {
private final VectorStore vectorStore;
public List<Document> search(String question) {
return vectorStore.similaritySearch(
SearchRequest.query(question).withTopK(5)
);
}
}相关
- Milvus — 开源向量数据库,超大规模场景首选
- Pinecone — 全托管云端方案,快速上手
- PostgreSQL — pgvector 扩展,小规模向量搜索
- Elasticsearch — 全文搜索 + 向量搜索兼顾
- 大模型 — Embedding 模型生成向量