Chroma, Pinecone, Weaviate, Milvus and Qdrant
π My Comparison | π Jupyter Notebooks
A live, interactive dashboard comparing 5 vector databases:
- Real performance benchmarks from testing 100 articles
- Feature comparison (hybrid search, metadata filtering, schema flexibility)
- Cost analysis with calculator links
- Production lessons learned
β‘οΈ View Live App
Hands-on Jupyter notebooks with code implementation for each database:
- Step-by-step setup and implementation
- Upsert operations, semantic search, metadata filtering
- Performance measurements and benchmarking
- Production tips and gotchas
β‘οΈ Browse Notebooks
Real-world testing with 100 articles, 5 standardized queries:
| Database | Avg Query Time | Cost (1M @ 1536-dim) | Best For |
|---|---|---|---|
| Milvus/Zilliz | 50.7ms π₯ | $115/mo | Fastest queries + good flexibility |
| Weaviate | 51.7ms π₯ | $160/mo | Native datetime/geo + hybrid search |
| Qdrant | 73.1ms π₯ | $103/mo | Best balance (speed + flexibility + cost) |
| Pinecone | 106.3ms | $30/mo | Cheapest ( |
| Chroma | 275.4ms | $139/mo | Easiest setup + prototyping |
Key Insight: 5.4x performance gap between fastest and slowest!
Want to explore the comparison app locally?
# Clone the repository
git clone https://github.com/portkeys/vector-db-comparison.git
cd vector-db-comparison
# Install dependencies
npm install
# Run development server
npm run devVisit http://localhost:3000 to see the app.
Note: The frontend is now organized in the frontend/ directory. You can also run it directly:
cd frontend
npm install
npm run devWant to test vector databases yourself?
- Python 3.10+
- API keys for vector databases (all have free tiers)
# Install Python dependencies
uv sync
# or: pip install -e .
# Copy environment template
cp .env.example .env
# Edit .env with your API keys
# PINECONE_API_KEY=your-key-here
# WEAVIATE_API_KEY=your-key-here
# etc.
# Launch Jupyter
jupyter notebook notebooks/01_chroma.ipynb- Easiest to start, schema-less metadata02_weaviate.ipynb- Native datetime filtering, hybrid search03_milvus.ipynb- Fastest queries with AUTOINDEX04_qdrant.ipynb- Most flexible metadata filtering05_pinecone.ipynb- Simplest API (β οΈ plan schema carefully)
Each notebook includes:
- Free tier setup instructions
- Data ingestion with embeddings
- Semantic search examples
- Metadata filtering tests
- Performance benchmarks
All databases offer free tiers for testing:
| Database | Free Tier | Signup Link |
|---|---|---|
| Chroma | $5 free credits, 5GB storage | trychroma.com |
| Qdrant | 1GB free forever cluster | cloud.qdrant.io |
| Pinecone | 2GB storage, 2M writes/mo | pinecone.io |
| Weaviate | 14-day free trial | console.weaviate.cloud |
| Milvus (Zilliz) | 5GB, 2.5M vCUs | cloud.zilliz.com |
Average query time across 5 semantic searches with metadata filtering
- Winner: Milvus/Zilliz (50.7ms)
Combining vector similarity with keyword search (BM25/TF-IDF)
- Integrated (easiest): Weaviate - single API call
- Middle Ground: Qdrant - manual fusion logic
- Manual (most code): Pinecone, Chroma, Milvus
Filtering by categories, date ranges, boolean flags
- Native datetime/geo: Only Weaviate and Qdrant
- Others: Require workarounds (timestamps, coordinate pairs)
Can you add new metadata fields without rebuilding?
- Excellent: Qdrant (schema-less), Chroma
- Good: Weaviate, Milvus (dynamic fields)
- Poor: Pinecone Serverless (declare all fields upfront)
Real pricing for 1M vectors @ 1536 dimensions (OpenAI embedding size)
- 5x cost variation between cheapest ($30) and most expensive ($160)
- See detailed cost breakdown in the live app
Critical: Schema Flexibility Matters
When migrating 1M vectors from Pinecone pod-based to serverless, we discovered you MUST define all filterable metadata fields at index creation. Adding new fields later (geo-location, time-based filtering) was impossible without a complete rebuild.
Our Recommendations:
- Need flexibility? β Qdrant or Chroma (schema-less)
- Need speed? β Milvus/Zilliz (50.7ms, AUTOINDEX)
- Need native datetime/geo? β Weaviate or Qdrant only
- Need cheapest? β Pinecone ($30/mo, but plan schema carefully!)
- Need best balance? β Qdrant ($103/mo, 73.1ms, excellent flexibility)
vector-db-comparison/
βββ π Frontend (React/TypeScript)
β βββ frontend/
β βββ src/
β β βββ components/
β β β βββ VectorDBComparison.tsx # Main comparison component
β β βββ main.tsx # React entry point
β β βββ index.css # Tailwind styles
β βββ index.html # HTML template
β βββ package.json # Frontend dependencies
β βββ vite.config.ts # Build configuration
β βββ tailwind.config.js # Tailwind config
β βββ tsconfig.json # TypeScript config
β
βββ π Jupyter Notebooks
β βββ notebooks/
β βββ 01_chroma.ipynb # Chroma testing
β βββ 02_weaviate.ipynb # Weaviate testing
β βββ 03_milvus.ipynb # Milvus/Zilliz testing
β βββ 04_qdrant.ipynb # Qdrant testing
β βββ 05_pinecone.ipynb # Pinecone testing
β
βββ π Documentation
β βββ docs/
β βββ chroma_setup.md # Chroma setup guide
β βββ weaviate_setup.md # Weaviate setup guide
β βββ milvus_setup.md # Milvus setup guide
β βββ qdrant_setup.md # Qdrant setup guide
β βββ pinecone_setup.md # Pinecone setup guide
β
βββ π οΈ Python Utilities
β βββ utils/ # Benchmark helpers
β βββ pyproject.toml # Python dependencies
β
βββ π Data
β βββ data/
β βββ sample_articles.json # 100 test articles
β
βββ package.json # Root package.json (workspace)
βββ README.md # This file
- Dataset: 100 articles (outdoor/travel content)
- Embedding Model: sentence-transformers/all-MiniLM-L6-v2 (384 dimensions)
- Test Queries: 5 standardized semantic searches
- Filters: Category, date range, boolean, combined filters
- Distance Metric: COSINE similarity
β
Milvus AUTOINDEX - Fastest queries (50.7ms) with zero manual tuning
β
Weaviate - Best developer experience with native datetime support (51.7ms)
β
Qdrant - Excellent balance of speed, flexibility, and cost (73.1ms, $103/mo)
This project shares production insights from real-world testing. Feel free to:
- Open issues for questions
- Submit PRs for improvements
- Share your own benchmark results
- Suggest additional databases to test
MIT License - See LICENSE file for details
- Embedding Model: sentence-transformers/all-MiniLM-L6-v2 (Hugging Face)
- Vector Databases: Chroma, Qdrant, Pinecone, Weaviate, Milvus/Zilliz
- UI Framework: React, TypeScript, Vite, Tailwind CSS
Built with β€οΈ for developers evaluating vector databases for production
Questions? Open an issue or check out the live demo!