Best Vector Databases Compared: Pinecone vs Rivals
A vector database comparison covering Pinecone, Weaviate, Qdrant, and Milvus — benchmarked on recall, write throughput, and hybrid search so you pick right.

Picking a vector database is not a retrieval-quality decision. It's an infrastructure decision that quietly determines your query latency ceiling, your filtered-search reliability, and how much engineering pain you'll absorb the moment your data volume doubles. Most teams make the choice based on the first tutorial they follow, and many end up re-migrating six months later when the constraints they didn't evaluate become blockers.
The market now has four serious contenders: Pinecone (managed-only), Weaviate (open-source with a managed cloud), Qdrant (open-source, self-hosted or cloud), and Milvus (open-source, built for horizontal scale). Each is genuinely capable at moderate scale. The gaps show up at the edges: heavy filtering, hybrid keyword-plus-vector search, write-heavy workloads, and the awkward moment when your index grows past what a single node was designed to hold.
This vector database comparison is a structured evaluation across the dimensions that actually shift architectural decisions: recall quality, filtered-search correctness, write throughput, and hybrid-search support. We'll also cover managed vs self-hosted trade-offs, because operational cost is as real as query cost.
What you'll learn
- How vector databases differ from each other
- Recall quality and HNSW tuning
- Filtered search: where most databases quietly break
- Hybrid search support compared
- Write throughput at scale
- Managed vs self-hosted trade-offs
- Which database fits which workload
- Frequently Asked Questions
How vector databases differ from each other
A vector database is a storage and retrieval system purpose-built for high-dimensional embedding vectors, where the core query primitive is approximate nearest-neighbor (ANN) search rather than exact key lookup. Standard relational databases can store vectors, but they can't run ANN queries efficiently at scale.
What distinguishes the four main options isn't the ANN algorithm. All four use HNSW (Hierarchical Navigable Small World) graphs as their default index, with minor variant implementations. The differences are in:
- Filtering architecture. Whether filters apply before or after the ANN traversal.
- Hybrid search. Native BM25 integration, or an afterthought bolted on.
- Operational model. Fully managed, self-hosted only, or a choice.
- Consistency guarantees. Whether you can trust freshly-upserted vectors to appear in the next query.
- Horizontal scaling. Shared-nothing cluster vs. single-node-first design.
Understanding these distinctions matters more than headline recall numbers, which tend to converge across vendors when you tune HNSW parameters appropriately.
Recall quality and HNSW tuning
All four databases implement HNSW, and all four let you tune the two parameters that most influence recall: ef_construction (how many candidates are considered when building the graph) and ef (the search-time beam width). Higher values improve recall and increase cost.
# Qdrant collection with tuned HNSW parameters
from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance, HnswConfigDiff
client = QdrantClient(host="localhost", port=6333)
client.create_collection(
collection_name="documents",
vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
hnsw_config=HnswConfigDiff(
m=16, # number of bi-directional links per node
ef_construct=200, # candidates considered during index build
full_scan_threshold=10_000, # fall back to brute-force below this
),
)
At default settings, all four databases hit roughly 95-97% recall on the ANN benchmarks suite (ann-benchmarks.com) for 1M-vector datasets at common embedding dimensions. The divergence appears under two conditions: when you add metadata filters to the query, and when you're running against a freshly-upserted segment that hasn't been fully indexed.
Pinecone's serverless tier uses a different index architecture (streaming disk-ann rather than HNSW) optimized for cold-start queries. Recall is competitive, but the query latency profile is less predictable under bursty traffic than a warm HNSW index.
Our honest take: recall quality should not be the deciding factor among these four databases, because you can close most recall gaps with a modest ef increase. The real deciding factors are what follows.
Filtered search: where most databases quietly break
Filtered search is where the most significant real-world differences appear, and it's the dimension that most blog comparisons underweight.
A filter in a vector search query restricts results to vectors whose associated metadata matches a condition: category = "legal", user_id = 12345, date > 2025-01-01. The wrong way to implement this is post-filtering: run ANN search for top-k results, then discard the ones that don't match the filter. This degrades recall severely at high selectivity. If only 2% of your vectors match the filter, a top-10 query might retrieve zero valid results after discarding the 99.8% that don't.
The correct approach is pre-filtering with graph-aware traversal (sometimes called "filtered HNSW"), where the ANN search only considers nodes that match the filter. This is architecturally harder and most databases get it wrong in at least some cases.
| Database | Filtering approach | Low-selectivity recall | Notes |
|---|---|---|---|
| Pinecone | Pre-filtering (namespace + metadata) | Good | Metadata filtering on serverless has latency cost |
| Weaviate | Pre-filtering via inverted index | Good | where filter integrates into HNSW traversal |
| Qdrant | Payload-indexed pre-filter | Excellent | Per-field indexes; falls back gracefully when needed |
| Milvus | Scalar-index pre-filter | Good | Requires explicit scalar index creation per field |
Qdrant's payload indexing system is the most explicit about this: you create per-field indexes and Qdrant chooses whether to apply a pre-filter or a post-filter based on estimated selectivity. This adaptive strategy means you don't need to know the filter cardinality in advance.
Milvus requires you to create scalar indexes explicitly. If you forget to create one on a filter field, Milvus falls back to a linear scan of the metadata, which kills performance at scale. It's a footgun that bites teams who move fast during prototyping.
Hybrid search support compared
Hybrid search combines dense vector similarity (semantic) with sparse keyword matching (BM25/TF-IDF). It consistently outperforms pure vector search on retrieval benchmarks, particularly for domain-specific terminology that embeddings handle poorly — product codes, proper nouns, error strings, medical terminology.
The practical difference is significant: a user searching for "CVE-2024-1234" expects an exact match. An embedding model maps that string to a general security-adjacent vector. BM25 finds the exact document; the vector search finds tangentially related content. Production RAG systems need both.
# Weaviate hybrid search with alpha weighting
import weaviate
import weaviate.classes as wvc
client = weaviate.connect_to_local()
collection = client.collections.get("Documents")
results = collection.query.hybrid(
query="CVE-2024-1234 remote code execution",
alpha=0.5, # 0 = pure BM25, 1 = pure vector, 0.5 = balanced
limit=10,
return_metadata=wvc.query.MetadataQuery(score=True, explain_score=True),
)
Weaviate has the most mature hybrid search implementation, having shipped BM25 integration early and iterated on fusion algorithms (RRF and relative score fusion are both available). Qdrant added hybrid search via sparse vector support: you index a sparse vector alongside the dense vector and combine scores at query time, which is flexible but requires maintaining two index types.
Pinecone's hybrid search on the serverless tier works but the sparse vector and dense vector indexes are separate namespaces that you merge client-side. The operational overhead is real. Milvus supports sparse-dense hybrid search natively, though documentation is thinner than Weaviate's.
If hybrid search is a core requirement rather than a nice-to-have, Weaviate's native BM25+vector fusion is the path of least friction.
Write throughput at scale
Write throughput matters whenever your use case involves continuous ingestion: a RAG system indexing new documents in real time, a recommendation system updating user embeddings hourly, or any pipeline where stale vectors hurt result quality.
HNSW is inherently write-expensive. Adding a vector to the graph requires traversal to find neighbors and bidirectional link creation, which is an O(log n) operation that involves locking parts of the graph. All four databases handle moderate write loads well (hundreds of vectors per second). The differences emerge at sustained high-throughput ingestion.
Milvus was purpose-built for write throughput at scale. Its segment-based architecture separates growing segments (write-optimized) from sealed segments (query-optimized), and uses a message queue (Kafka or Pulsar) to buffer writes. This architecture handles tens of thousands of vectors per second without degrading query performance, at the cost of significant operational complexity when self-hosting.
Qdrant handles write throughput well in single-node mode and uses optimistic concurrency for upserts. The wait=false parameter lets you fire-and-forget writes while accepting that very recent writes may not appear in queries immediately.
# Qdrant async upsert for high-throughput ingestion
from qdrant_client.models import PointStruct
points = [
PointStruct(id=i, vector=embeddings[i], payload={"source": f"doc_{i}"})
for i in range(10_000)
]
# wait=False returns immediately; vector is queryable after indexing completes
client.upsert(
collection_name="documents",
points=points,
wait=False,
)
Pinecone's serverless tier optimizes for query latency over write latency. Ingestion is asynchronous and freshness is eventually consistent (a relevant concern for systems where a user might query immediately after uploading a document).
Weaviate's write throughput is solid for most production workloads but becomes the bottleneck first in write-heavy scenarios compared to Milvus.
Managed vs self-hosted trade-offs
This is an operational decision masquerading as a technical one, and it deserves honest treatment.
Pinecone is managed-only. There's no self-hosted option. You get zero operational overhead, automatic scaling, and a predictable API. You give up data residency control, the ability to run inside your own VPC without additional configuration, and the option to switch away without a full data migration. The pricing model (per read unit / write unit) can become expensive at high query volume. The math often surprises teams at scale.
Weaviate offers both a managed cloud (Weaviate Cloud) and open-source self-hosted. The self-hosted path has good Docker and Kubernetes support. The trade-off is real: self-hosted Weaviate requires you to manage backups, schema migrations, and the operational complexity of running a stateful distributed service.
Qdrant is self-hosted first with a managed cloud option. The self-hosted experience is the smoothest of the three open-source options: single binary, clean REST and gRPC APIs, good Kubernetes helm chart. It's the option we at Laxaar most often recommend to teams who want control without full Milvus complexity.
Milvus is the most powerful and the most operationally demanding. Running Milvus in distributed mode requires etcd, MinIO (or S3), and a message queue alongside the actual Milvus nodes. It's appropriate when write throughput and horizontal scaling are genuinely required. For most RAG systems processing under a billion vectors, it's over-engineered.
Which database fits which workload
The decision matrix, written plainly:
-
You want zero operational overhead and your data volume is under 100M vectors: Pinecone serverless. Accept the pricing model and move on. The engineering time saved is worth it at early stage.
-
Hybrid search is a first-class requirement: Weaviate. Its BM25 integration is production-tested and the fusion algorithm tuning is well-documented.
-
You need self-hosted control with minimal ops complexity: Qdrant. Best developer experience of the open-source options, strong filtering, actively maintained.
-
You're ingesting millions of vectors per day and need horizontal write scale: Milvus. Accept the operational investment; it pays off at genuine data scale.
-
You're building a RAG system for internal documents and aren't sure yet: Start with Qdrant locally, then migrate to Qdrant Cloud or switch to Pinecone once you know your production scale. The API development services and retrieval architecture are separable concerns, so don't let database lock-in couple them.
For teams building generative AI applications that depend on retrieval quality, the choice of vector database is one input among many. The chunking strategy, embedding model, and re-ranking layer often contribute more to end-to-end retrieval quality than which ANN algorithm the database uses under the hood.
The Laxaar team builds RAG pipelines across all four databases depending on client infrastructure constraints. Our default starting point is Qdrant for new projects where self-hosted is viable, and Pinecone for teams that want a managed service and haven't yet justified the operational investment in an open-source alternative. We've built production systems on Weaviate for clients where hybrid search was non-negotiable from day one, and on Milvus for high-volume data platforms that need sustained write throughput.
If you're evaluating vector databases for a production AI engineering project, the most useful thing you can do before benchmarking is write down your filter cardinality, expected query-per-second at steady state, and whether hybrid search is required. Those three answers eliminate most options before you write a line of code.
Frequently Asked Questions
Does Pinecone or Qdrant perform better for filtered vector search?
Both handle filtered search well, but through different architectures. Qdrant's adaptive pre-filter strategy (it chooses pre-filter or post-filter based on estimated selectivity) tends to be more robust across diverse filter conditions without manual tuning. Pinecone performs reliably on metadata filters but has less transparency into how filters interact with the underlying index, which makes tuning harder when recall drops.
Can I use PostgreSQL with pgvector instead of a dedicated vector database?
Yes, and for smaller datasets it's a reasonable choice. pgvector with an HNSW index handles tens of millions of vectors adequately, and you avoid adding another service to your infrastructure. The limits show at high query concurrency (pgvector doesn't match a dedicated database's ANN throughput) and at very large scale (pgvector's HNSW index is single-node). If you're already running PostgreSQL and your vector workload is secondary to your relational workload, pgvector is worth trying before you introduce a new database category.
How do I benchmark recall for my specific dataset?
Don't rely on published benchmarks alone. Build a ground-truth evaluation set: take 200-500 representative queries, compute exact nearest neighbors using a brute-force search on your actual embeddings, then measure how often your ANN index returns those exact neighbors in its top-k results. This gives you dataset-specific recall numbers rather than vendor-favorable synthetic ones. Run this evaluation after every schema or parameter change.
What's the biggest migration risk when switching vector databases?
Re-embedding lock-in. If you generated embeddings with a model that the new database's client library or integration doesn't support directly, you may need to re-embed your entire corpus. The mitigation is to store original source text alongside embeddings and treat the embedding model as swappable from the start. Also budget for index rebuild time — rebuilding an HNSW index over 50M vectors takes hours even on fast hardware.
Do vector databases handle multi-tenancy for SaaS applications?
All four support multi-tenancy, but the mechanisms differ. Qdrant and Weaviate support tenant-level isolation within a single collection (reducing overhead versus separate collections per tenant). Pinecone uses namespaces. Milvus uses partitions. None of these are as strong as database-level isolation, so for strict compliance requirements you'll want separate collections or separate clusters per tenant. The performance and cost trade-offs of each approach are substantial enough to design for before you're in production.
Building a RAG pipeline or AI search system and not sure which vector store fits your architecture? Talk to the Laxaar team — we've shipped production retrieval systems across all the major options and can help you choose based on your actual workload, not the benchmarks that favor the vendor paying for them.
Working on something like this?
Get a fixed scope, timeline, and price within one business day — no obligation.


