Vector Databases Compared 2026: Pinecone vs Weaviate vs Chroma vs Milvus vs Qdrant
Advertisement
Vector Databases 2026: The Definitive Comparison
Vector databases are the backbone of modern AI applications — powering RAG, semantic search, recommendation engines, and anomaly detection. Choosing the wrong one can cost you months of migration work.
- Quick Comparison Table
- Pinecone: Managed Simplicity
- ChromaDB: The Local Dev Standard
- Weaviate: The Flexible Choice
- Qdrant: Best Performance-per-Dollar
- Which Should You Choose?
- Cost Estimates at Scale
Quick Comparison Table
| Feature | Pinecone | Weaviate | ChromaDB | Milvus | Qdrant |
|---|---|---|---|---|---|
| Hosted option | ✅ Managed | ✅ Cloud | ❌ | ✅ Cloud | ✅ Cloud |
| Self-hosted | ❌ | ✅ | ✅ | ✅ | ✅ |
| Free tier | ✅ | ✅ | ✅ | ✅ | ✅ |
| Hybrid search | ✅ | ✅ | Limited | ✅ | ✅ |
| GraphQL API | ❌ | ✅ | ❌ | ❌ | ❌ |
| Filtering | ✅ | ✅ | Basic | ✅ | ✅ |
| Scale (vectors) | Billions | Billions | Millions | Billions | Billions |
| Best for | Simplicity | Flexible search | Local dev | Scale | Performance |
Pinecone: Managed Simplicity
Pinecone is the easiest to start with — fully managed, no infrastructure to manage.
from pinecone import Pinecone, ServerlessSpec
pc = Pinecone(api_key="your-key")
# Create index
pc.create_index(
name="my-index",
dimension=1536,
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1")
)
index = pc.Index("my-index")
# Upsert vectors
vectors = [
("doc1", [0.1, 0.2, ...], {"source": "faq.pdf", "page": 1}),
("doc2", [0.3, 0.4, ...], {"source": "manual.pdf", "page": 5}),
]
index.upsert(vectors=[(id, vec, meta) for id, vec, meta in vectors])
# Query
results = index.query(
vector=[0.1, 0.2, ...],
top_k=5,
include_metadata=True,
filter={"source": {"$eq": "faq.pdf"}} # metadata filter
)
for match in results.matches:
print(f"Score: {match.score:.3f} | {match.metadata}")
Pros: Zero-ops, excellent Python SDK, automatic scaling Cons: Expensive at scale, no self-hosted option, vendor lock-in
ChromaDB: The Local Dev Standard
ChromaDB is the go-to for local development and small-scale production. Ships with LangChain/LlamaIndex integrations out of the box.
import chromadb
from chromadb.utils import embedding_functions
# In-memory (testing) or persistent (production)
client = chromadb.PersistentClient(path="./chroma_db")
# Create collection with OpenAI embeddings
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
api_key="your-key",
model_name="text-embedding-3-small"
)
collection = client.get_or_create_collection(
name="my_docs",
embedding_function=openai_ef,
metadata={"hnsw:space": "cosine"}
)
# Add documents (auto-embeds!)
collection.add(
documents=["Python is a programming language", "JavaScript runs in browsers"],
metadatas=[{"source": "wiki"}, {"source": "wiki"}],
ids=["doc1", "doc2"]
)
# Query
results = collection.query(
query_texts=["scripting language for data science"],
n_results=3,
where={"source": "wiki"}, # filter
)
print(results["documents"])
print(results["distances"])
Pros: Zero setup, free, great for prototyping, LangChain native Cons: Single-node only, no production scale, limited filtering
Weaviate: The Flexible Choice
Weaviate supports hybrid search (vector + BM25 keyword) natively — a huge advantage for real-world queries where users don't always write "semantic" questions.
import weaviate
from weaviate.classes.config import Configure, Property, DataType
from weaviate.classes.query import MetadataQuery
client = weaviate.connect_to_weaviate_cloud(
cluster_url="https://your-cluster.weaviate.network",
auth_credentials=weaviate.auth.AuthApiKey("your-key"),
)
# Create collection
client.collections.create(
name="Article",
vectorizer_config=Configure.Vectorizer.text2vec_openai(),
properties=[
Property(name="title", data_type=DataType.TEXT),
Property(name="content", data_type=DataType.TEXT),
Property(name="category", data_type=DataType.TEXT),
]
)
collection = client.collections.get("Article")
# Add objects (auto-vectorized)
collection.data.insert({
"title": "Introduction to RAG",
"content": "Retrieval-Augmented Generation combines...",
"category": "AI"
})
# Hybrid search (vector + keyword)
results = collection.query.hybrid(
query="how does retrieval augmented generation work",
alpha=0.5, # 0=pure BM25, 1=pure vector
limit=5,
return_metadata=MetadataQuery(score=True),
)
for obj in results.objects:
print(f"Score: {obj.metadata.score:.3f} | {obj.properties['title']}")
Qdrant: Best Performance-per-Dollar
Qdrant is Rust-based, extremely fast, and has the best performance benchmarks of any open-source vector DB.
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct, Filter, FieldCondition, MatchValue
client = QdrantClient(url="http://localhost:6333")
# Create collection
client.create_collection(
collection_name="my_collection",
vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
)
# Insert vectors
points = [
PointStruct(id=1, vector=[0.1]*1536, payload={"text": "Hello", "lang": "en"}),
PointStruct(id=2, vector=[0.2]*1536, payload={"text": "Bonjour", "lang": "fr"}),
]
client.upsert(collection_name="my_collection", points=points)
# Search with filter
results = client.search(
collection_name="my_collection",
query_vector=[0.15]*1536,
query_filter=Filter(
must=[FieldCondition(key="lang", match=MatchValue(value="en"))]
),
limit=5,
with_payload=True,
)
Which Should You Choose?
For local development / prototyping: ChromaDB — zero setup, works everywhere.
For a production startup (managed): Pinecone — most mature managed service, best DevEx.
For hybrid search (vector + keyword): Weaviate — native BM25 + vector hybrid is unmatched.
For self-hosted production at scale: Qdrant — fastest, most efficient, great observability.
For massive scale (1B+ vectors): Milvus — built for distributed workloads.
Cost Estimates at Scale
| Vectors | Pinecone | Qdrant Cloud | Weaviate Cloud |
|---|---|---|---|
| 100K | Free | Free | Free |
| 1M | ~$70/mo | ~$25/mo | ~$25/mo |
| 10M | ~$700/mo | ~$200/mo | ~$300/mo |
| 100M | ~$7,000/mo | Self-host | Self-host |
Advertisement