====== Qdrant ======
**Qdrant** is a high-performance, open-source vector similarity search engine and database written in Rust. With over **30,000 GitHub stars**, it is designed for production-grade applications requiring fast, filtered vector search with rich payload support and horizontal scalability.
| **Repository** | [[https://github.com/qdrant/qdrant|github.com/qdrant/qdrant]] |
| **License** | Apache 2.0 |
| **Language** | Rust |
| **Stars** | 30K+ |
| **Category** | Vector Database |
===== Key Features =====
* **Written in Rust** -- Memory-safe, zero-cost abstractions, and exceptional performance without garbage collection pauses
* **Filterable HNSW** -- Extended HNSW index with filter-aware edges for efficient filtered vector search
* **Rich Payload Support** -- Attach JSON metadata to vectors with keyword, float, geo, and datetime index types
* **Quantization** -- Scalar and product quantization for memory reduction while maintaining search quality
* **Distributed Mode** -- Horizontal scaling with sharding and replication for high availability
* **Dual API** -- Both REST and gRPC interfaces for flexibility and performance
* **Multi-Vector Support** -- Store multiple named vectors per point for different embedding models
===== Architecture =====
Qdrant is designed as a standalone service with a focus on performance and operational simplicity:
* **Storage Engine** -- Segments-based architecture where each collection is divided into segments containing vectors, payloads, and indexes
* **HNSW Index** -- Multi-layered graph structure enabling sublinear search scaling (logarithmic with dataset size)
* **Payload Indexes** -- Separate indexes for structured metadata enabling efficient pre-filtering
* **WAL** -- Write-ahead log for durability and crash recovery
* **Consensus** -- Raft-based consensus for distributed deployments
graph TB
subgraph API["API Layer"]
REST[REST API]
GRPC[gRPC API]
end
subgraph Engine["Search Engine"]
Router[Query Router]
Planner[Query Planner]
Filter[Filter Engine]
end
subgraph Collections["Collection Layer"]
C1[Collection 1]
C2[Collection 2]
end
subgraph Segments["Segment Storage"]
HNSW[HNSW Index]
Payload[Payload Index]
Vectors[Vector Storage]
WAL[Write-Ahead Log]
end
subgraph Distributed["Distributed Layer"]
Shard[Sharding]
Replica[Replication]
Raft[Raft Consensus]
end
API --> Engine
Engine --> Collections
Collections --> Segments
Collections --> Distributed
===== HNSW Configuration =====
HNSW performance is controlled through three primary parameters:
* **m** -- Controls graph connectivity (edges per node). Larger values increase accuracy but require more memory. Default: 16
* **ef_construct** -- Neighbors considered during index building. Larger values improve accuracy but increase build time. Default: 100
* **hnsw_ef** -- Set at search time to balance speed vs recall. Default: 128; lower (32) for speed, higher (256) for accuracy
For small datasets below the ''full_scan_threshold'' (default 10,000 KB), Qdrant automatically uses brute-force search for better performance.
===== Filterable HNSW =====
Qdrant extends standard HNSW by adding extra edges based on indexed payload values, enabling efficient searches under structured conditions without full-scan operations. Key considerations:
* Payload fields are **not indexed by default** -- you must explicitly define which fields to index
* Best practice: create payload indexes **before** uploading data so HNSW builds filter-aware links from the start
* Supported index types: KEYWORD (categorical), FLOAT (numerical ranges), GEO (spatial), DATETIME (temporal)
===== Code Example =====
from qdrant_client import QdrantClient
from qdrant_client.models import (
Distance, VectorParams, PointStruct,
Filter, FieldCondition, MatchValue,
PayloadSchemaType
)
client = QdrantClient(host="localhost", port=6333)
# Create collection with HNSW configuration
client.create_collection(
collection_name="documents",
vectors_config=VectorParams(
size=768, distance=Distance.COSINE,
hnsw_config={"m": 16, "ef_construct": 100}
)
)
# Create payload index BEFORE inserting data
client.create_payload_index(
collection_name="documents",
field_name="category",
field_schema=PayloadSchemaType.KEYWORD
)
# Insert vectors with payloads
client.upsert(
collection_name="documents",
points=[
PointStruct(id=1, vector=[0.1] * 768,
payload={"title": "RAG Guide", "category": "ai"}),
PointStruct(id=2, vector=[0.2] * 768,
payload={"title": "SQL Basics", "category": "database"}),
]
)
# Filtered vector search
results = client.search(
collection_name="documents",
query_vector=[0.15] * 768,
query_filter=Filter(
must=[FieldCondition(key="category", match=MatchValue(value="ai"))]
),
limit=5
)
for r in results:
print(f"{r.payload['title']}: {r.score:.4f}")
===== References =====
* [[https://github.com/qdrant/qdrant|Qdrant GitHub Repository]]
* [[https://qdrant.tech|Qdrant Official Website]]
* [[https://qdrant.tech/documentation/concepts/indexing/|Qdrant Indexing Documentation]]
* [[https://qdrant.tech/course/essentials/|Qdrant Essentials Course]]
===== See Also =====
* [[milvus|Milvus]] -- Cloud-native vector database in Go/C++
* [[chromadb|ChromaDB]] -- AI-native embedding database
* [[mem0|Mem0]] -- Memory layer using Qdrant as backend
* [[ragflow|RAGFlow]] -- RAG engine for document understanding
* [[lightrag|LightRAG]] -- Knowledge graph RAG framework