Back to writing

Vector Databases Compared: Pinecone vs Weaviate vs Qdrant vs Milvus

7 min read

The Vector Database Decision

You're building a RAG system, semantic search, or recommendation engine. You need a vector database. You Google "best vector database" and get overwhelmed by marketing claims.

I've deployed production systems on Pinecone, Weaviate, Qdrant, and Milvus. Here's what actually matters when choosing between them.

TL;DR: When to Use Each

Pinecone: Easiest to get started, best for early-stage products, managed service, predictable pricing, limited customization

Weaviate: Best for complex filtering + hybrid search, strong schema support, GraphQL interface, self-hosted or cloud

Qdrant: Best performance/$ ratio, Rust-based speed, excellent filtering, great for high-throughput use cases

Milvus: Best for massive scale (100M+ vectors), most flexible, requires more ops expertise, open-source

Now let's go deep.

Pinecone: The Managed Option

What it's good at:

What it's not good at:

Pricing Reality (2026):

1M vectors (1536 dims) + 100K queries/month:
- Starter: $70/month
- Standard: $150/month
- Enterprise: Custom (usually $500+)

At 10M vectors: ~$700-1500/month depending on QPS.

When to choose Pinecone:

Code Example:

import pinecone

pinecone.init(api_key="YOUR_KEY", environment="us-east-1-aws")

index = pinecone.Index("my-index")

# Upsert vectors
index.upsert(vectors=[
    ("id1", [0.1, 0.2, ...], {"category": "tech"}),
    ("id2", [0.3, 0.4, ...], {"category": "finance"})
])

# Query with metadata filter
results = index.query(
    vector=[0.5, 0.6, ...],
    top_k=10,
    filter={"category": "tech"}
)

Clean. Simple. Production-ready.

Weaviate: The Hybrid Search Champion

What it's good at:

What it's not good at:

Pricing (Self-Hosted vs Cloud):

Self-hosted: $200-500/month for 10M vectors (EC2/GCP compute + storage)

Weaviate Cloud: Starting at $25/month, scales to $300-800 for 10M vectors

When to choose Weaviate:

Code Example:

import weaviate

client = weaviate.Client("http://localhost:8080")

# Create schema with rich metadata
class_obj = {
    "class": "Article",
    "properties": [
        {"name": "title", "dataType": ["text"]},
        {"name": "content", "dataType": ["text"]},
        {"name": "category", "dataType": ["string"]},
        {"name": "published_date", "dataType": ["date"]}
    ]
}

client.schema.create_class(class_obj)

# Hybrid search (vector + keyword)
result = (
    client.query
    .get("Article", ["title", "content"])
    .with_hybrid(query="machine learning", alpha=0.75)  # 75% vector, 25% keyword
    .with_where({
        "path": ["category"],
        "operator": "Equal",
        "valueString": "AI"
    })
    .with_limit(10)
    .do()
)

Powerful filtering + hybrid search is where Weaviate shines.

Qdrant: The Performance Beast

What it's good at:

What it's not good at:

Pricing Reality:

Self-hosted: $100-300/month for 10M vectors (way cheaper compute requirements than Weaviate)

Qdrant Cloud: $0.40/GB storage + $0.12/1M queries (typically $200-400/month for 10M vectors)

When to choose Qdrant:

Code Example:

from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct, Filter, FieldCondition, MatchValue

client = QdrantClient("localhost", port=6333)

# Create collection
client.create_collection(
    collection_name="my_collection",
    vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
)

# Upsert with rich payload
client.upsert(
    collection_name="my_collection",
    points=[
        PointStruct(
            id=1,
            vector=[0.1, 0.2, ...],
            payload={"category": "tech", "author": "Alice", "score": 95}
        )
    ]
)

# Complex filtering
results = client.search(
    collection_name="my_collection",
    query_vector=[0.5, 0.6, ...],
    query_filter=Filter(
        must=[
            FieldCondition(key="category", match=MatchValue(value="tech")),
            FieldCondition(key="score", range={"gte": 90})
        ]
    ),
    limit=10
)

Fast, flexible, cost-effective.

Milvus: The Scale Monster

What it's good at:

What it's not good at:

Pricing (Self-Hosted Only):

10M vectors: $300-600/month (compute + storage)

100M vectors: $1500-3000/month

1B+ vectors: $10K+/month (but handles scale others can't)

When to choose Milvus:

Code Example:

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection

connections.connect("default", host="localhost", port="19530")

# Define schema
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=1536),
    FieldSchema(name="category", dtype=DataType.VARCHAR, max_length=100)
]

schema = CollectionSchema(fields, description="My collection")
collection = Collection("my_collection", schema)

# Create index with GPU support
index_params = {
    "metric_type": "IP",
    "index_type": "IVF_FLAT",
    "params": {"nlist": 1024}
}
collection.create_index(field_name="embeddings", index_params=index_params)

# Insert
data = [
    [[0.1, 0.2, ...], [0.3, 0.4, ...]],  # embeddings
    ["tech", "finance"]  # categories
]
collection.insert(data)

# Search with filtering
search_params = {"metric_type": "IP", "params": {"nprobe": 10}}
results = collection.search(
    data=[[0.5, 0.6, ...]],
    anns_field="embeddings",
    param=search_params,
    limit=10,
    expr='category == "tech"'
)

Built for scale.

Performance Benchmarks (Real Data)

I ran 10M vectors (1536 dims) across all four. Here's what I measured:

Query Latency (p95, single query):

Throughput (queries/sec, single node):

Filtering Performance (complex filter + vector search):

Caveat: Your mileage will vary based on hardware, data distribution, and query patterns.

Cost Comparison at Scale

10M vectors, 1M queries/month:

  1. Qdrant (cloud): $250/month
  2. Qdrant (self-hosted): $180/month
  3. Weaviate (cloud): $400/month
  4. Weaviate (self-hosted): $280/month
  5. Pinecone: $800/month
  6. Milvus (self-hosted): $350/month

100M vectors, 10M queries/month:

  1. Qdrant (self-hosted): $1200/month
  2. Milvus (self-hosted): $1800/month
  3. Weaviate (self-hosted): $2500/month
  4. Pinecone: $6000+/month
  5. Qdrant (cloud): Would recommend self-hosted at this scale

Migration Path

Start: Pinecone (get to market fast)

Scale: Migrate to Qdrant when you hit 5-10M vectors or $500+/month

Enterprise: Migrate to Milvus when you need 100M+ vectors or multi-region deployment

Special case: Use Weaviate if you need hybrid search from day 1

My Recommendation

For most teams: Start with Pinecone, migrate to Qdrant when cost becomes painful.

If you have infra expertise: Qdrant from day 1 (self-hosted).

If you need hybrid search: Weaviate.

If you're operating at massive scale: Milvus.

What Actually Matters

The choice matters less than you think early on. All four work. Pick based on:

  1. Team expertise: Can you manage infrastructure?
  2. Budget: How much can you spend?
  3. Scale: How many vectors in 12 months?
  4. Features: Do you need hybrid search? Complex filtering? GPU support?

Start simple. Migrate when you have real data on performance, cost, and scale.


What are you using? I'd love to hear your production experience with vector databases. Twitter | Email

Enjoying this article?

Get deep technical guides like this delivered weekly.

Get AI growth insights weekly

Join engineers and product leaders building with AI. No spam, unsubscribe anytime.

Keep reading