Qdrant

返回 向量数据库

Qdrant 是用 Rust 编写的开源向量数据库,以高性能、低内存占用和丰富的过滤能力著称,提供 REST API 和多语言 SDK,同时也有托管云服务。


与同类对比

维度QdrantMilvusPinecone
实现语言RustGo闭源
部署方式自建 / 云托管自建云托管
内存占用极低中等托管无需关心
过滤能力丰富,支持嵌套条件基础基础
混合搜索支持(稠密 + 稀疏)支持支持
适用场景资源受限、复杂过滤超大规模快速原型

核心概念

概念说明
Collection向量集合,类似表
Point一条记录,包含 id、vector、payload
Payload随向量存储的 JSON 元数据,用于过滤
SegmentCollection 内部的存储分段

部署

# Docker 单机部署
docker run -p 6333:6333 -p 6334:6334 \
    -v $(pwd)/qdrant_storage:/qdrant/storage \
    qdrant/qdrant
 
# REST API 端口:6333
# gRPC 端口:6334

Python 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 模型生成向量