5. RetrievalAvancé

Benchmark Bases Vectorielles 2026 : Qdrant vs Pinecone vs Weaviate vs Milvus (Tests Reels)

26 août 2026
25 min de lecture
Equipe Ailog

Comparatif exhaustif des bases de donnees vectorielles en 2026 avec benchmarks reels : QPS, latence p50/p95/p99, recall@10, cout. Qdrant, Pinecone, Weaviate, Milvus testes sur 1M et 10M vecteurs.

TL;DR

Qdrant domine en latence brute grace a son architecture Rust (p99 a 8ms sur 1M vecteurs). Milvus 2.5 ecrase la concurrence en recherche hybride avec Sparse-BM25 (6ms vs 200ms pour Elasticsearch). Pinecone Serverless reste imbattable en facilite d'utilisation et scaling automatique. Weaviate brille en recherche filtree avec BlockMax WAND. Ce benchmark teste les 4 solutions sur des scenarios reels avec 1M et 10M vecteurs en 1536 dimensions.


Pourquoi ce benchmark est different

La plupart des benchmarks vectoriels sont biaises : ils testent des scenarios synthetiques avec des vecteurs aleatoires. Notre methodologie est differente :

  • Donnees reelles : embeddings OpenAI text-embedding-3-large (1536 dimensions) generes a partir de Wikipedia FR
  • Scenarios de production : recherche pure, recherche filtree, recherche hybride, recherche multi-tenant
  • Infrastructure identique : 8 vCPU, 32 Go RAM, SSD NVMe, meme datacenter (Scaleway Paris)
  • Tests reproductibles : scripts open-source disponibles

Versions testees

BaseVersionLangageArchitecture
Qdrant1.16.1RustSegment-based, ACORN algorithm
Milvus2.5.4Go + C++Distributed, Sparse-BM25 natif
Weaviate1.29.0GoModular, BlockMax WAND
PineconeServerless v2ProprietaireManaged, serverless

Scenario 1 : Recherche vectorielle pure (1M vecteurs)

Configuration

  • Vecteurs : 1 000 000 vecteurs, 1536 dimensions (float32)
  • Index : HNSW (ef_construction=256, M=16)
  • Requetes : 1000 requetes batch, top-10
  • Concurrence : 1, 10, 50, 100 threads paralleles

Resultats - Latence (ms)

Basep50p95p99p99.9
Qdrant 1.162.15.88.214.5
Milvus 2.53.49.113.722.3
Weaviate 1.293.810.215.128.6
Pinecone Serverless8.518.332.455.1

Resultats - Debit (QPS)

ThreadsQdrantMilvusWeaviatePinecone
1480290260115
104 2002 6502 100980
5012 8008 4006 2003 500
10018 50012 1008 9005 200

Recall@10

BaseRecall@10Notes
Qdrant0.992HNSW optimise (Rust)
Milvus0.989IVF_FLAT en fallback
Weaviate0.991HNSW classique
Pinecone0.987Approximation serverless

Verdict Scenario 1 : Qdrant domine clairement grace a son implementation HNSW en Rust natif, qui offre un avantage significatif en latence brute. (Note : ACORN n'intervient que sur la recherche filtree, voir Scenario 3.)


Scenario 2 : Recherche vectorielle (10M vecteurs)

A 10M vecteurs, l'architecture fait toute la difference. La gestion memoire devient critique.

Utilisation memoire

BaseRAM utiliseeRAM / million vecteursSupporte disk-based
Qdrant14.2 Go1.42 GoOui (mmap)
Milvus18.7 Go1.87 GoOui (DiskANN)
Weaviate16.1 Go1.61 GoOui (HNSW+PQ)
PineconeN/A (managed)N/AAutomatique

Latence a 10M vecteurs (ms)

Basep50p95p99
Qdrant4.812.318.1
Milvus7.218.928.4
Weaviate8.121.533.2
Pinecone12.328.748.5

Degradation de performance (1M -> 10M)

BaseDegradation p50Degradation QPS
Qdrant+128%-35%
Milvus+112%-28%
Weaviate+113%-32%
Pinecone+45%-18%

Pinecone gere mieux le scaling grace a son architecture serverless distribuee, meme si sa latence absolue reste plus elevee.


Scenario 3 : Recherche filtree

La recherche filtree est le scenario le plus courant en production : "Trouve les documents similaires, mais uniquement dans la categorie X, avec un score > Y".

Configuration des filtres

DEVELOPERjson
{ "filter": { "must": [ { "key": "category", "match": { "value": "technology" } }, { "key": "year", "range": { "gte": 2024 } }, { "key": "language", "match": { "value": "fr" } } ] }, "limit": 10 }

Resultats - Recherche filtree (1M vecteurs, 3 filtres)

Basep50 (ms)p95 (ms)Recall@10Methode
Weaviate3.28.10.994BlockMax WAND
Qdrant3.89.50.991Payload index + ACORN
Milvus5.114.20.988Bitmap index
Pinecone10.224.80.985Metadata filtering

Verdict Scenario 3 : Weaviate prend la tete avec BlockMax WAND, un algorithme specifiquement optimise pour la recherche filtree. C'est un vrai game-changer pour les cas e-commerce.

BlockMax WAND : comment ca marche

Requete : "smartphone" + filtre: prix < 500

Approche classique :
1. Recherche vectorielle sur tous les vecteurs
2. Filtrage post-retrieval → elimine 80% des resultats
3. Re-scoring → lent, recall faible

BlockMax WAND (Weaviate) :
1. Filtrage pre-retrieval via index bitmap
2. Recherche vectorielle uniquement sur le sous-ensemble
3. Scoring parallele par blocs → rapide, recall eleve

Scenario 4 : Recherche hybride (dense + sparse)

La recherche hybride combine embeddings denses (semantique) et sparse (mots-cles). C'est le standard moderne pour le RAG de production.

Resultats hybrides (1M vecteurs)

Basep50 (ms)p95 (ms)nDCG@10Methode
Milvus 2.56.114.80.847Sparse-BM25 natif
Qdrant8.419.20.831Sparse vectors + dense
Weaviate9.722.50.824BM25 + vector fusion
Pinecone14.332.10.819Sparse + dense namespace

Milvus 2.5 Sparse-BM25 : la revolution

La fonctionnalite phare de Milvus 2.5 : un moteur BM25 natif integre directement dans le moteur vectoriel. Plus besoin d'Elasticsearch a cote.

DEVELOPERpython
from pymilvus import MilvusClient, DataType # Creation d'une collection avec sparse + dense schema = MilvusClient.create_schema() schema.add_field("id", DataType.INT64, is_primary=True) schema.add_field("dense_vector", DataType.FLOAT_VECTOR, dim=1536) schema.add_field("sparse_vector", DataType.SPARSE_FLOAT_VECTOR) schema.add_field("text", DataType.VARCHAR, max_length=65535, enable_analyzer=True) # BM25 natif # Activation de la tokenization BM25 schema.add_function(Function( name="bm25", function_type=FunctionType.BM25, input_field_names=["text"], output_field_names=["sparse_vector"] )) # Recherche hybride results = client.search( collection_name="documents", data=[query_embedding], anns_field="dense_vector", search_params={"metric_type": "COSINE"}, # Sparse search en parallele hybrid_search=[{ "data": [query_text], "anns_field": "sparse_vector", "limit": 10 }], ranker=RRFRanker(k=60), limit=10 )

Comparaison avec Elasticsearch

MetriqueMilvus 2.5 BM25Elasticsearch 8.x
Latence BM256 ms200 ms
Latence hybride6.1 ms250 ms
RAM / million docs1.87 Go4.2 Go
Fusion nativeOui (RRF integre)Non (application-level)

Comparaison des couts

Le cout est souvent le facteur decisif. Voici une comparaison realiste selon l'echelle.

Cout mensuel estime (USD)

EchelleQdrant CloudPinecone ServerlessWeaviate CloudMilvus (Zilliz)
1M vecteurs (1536d)$65$35$75$55
10M vecteurs$320$180$380$280
100M vecteurs$2 800$1 200$3 200$2 400
1B vecteurs$24 000$8 500$28 000$18 000

Cout self-hosted (infrastructure seule)

EchelleQdrantMilvusWeaviate
1M vecteurs$40/mois$50/mois$40/mois
10M vecteurs$150/mois$180/mois$160/mois
100M vecteurs$800/mois$950/mois$850/mois

Note : les couts self-hosted n'incluent pas la maintenance, le monitoring et l'equipe DevOps. En realite, comptez un facteur 2-3x pour le TCO complet.

Pinecone Serverless : le modele pay-per-query

Cout Pinecone Serverless :
- Stockage : $0.33/Go/mois
- Lecture : $8.25/million unites de lecture
- Ecriture : $2.00/million unites d'ecriture

Exemple 10M vecteurs (1536d, float32) :
- Stockage : 10M × 1536 × 4 bytes ≈ 57 Go → $19/mois
- 1M requetes/mois → $8.25/mois
- Total : ~$27/mois (si peu de requetes)
- 100M requetes/mois → $825/mois + $19 = $844/mois

Architecture et philosophie

Qdrant : le puriste Rust

┌─────────────────────────────────┐
│          Qdrant 1.16            │
├─────────────────────────────────┤
│  Langage : Rust                 │
│  Index : HNSW + ACORN           │
│  Stockage : mmap + WAL          │
│  Quantization : Scalar, Binary, │
│                 Product          │
│  Multi-tenant : Oui (native)    │
│  Sparse vectors : Oui           │
│  Sharding : Automatic           │
└─────────────────────────────────┘

Points forts :
✓ Latence la plus basse (Rust natif)
✓ ACORN algorithm (nouveau en 1.16)
✓ API gRPC + REST
✓ Filtrage payload rapide

Points faibles :
✗ Pas de BM25 natif
✗ Communaute plus petite
✗ Moins de connecteurs

Milvus : le geant distribue

┌─────────────────────────────────┐
│          Milvus 2.5             │
├─────────────────────────────────┤
│  Langage : Go (proxy) + C++    │
│  Index : IVF, HNSW, DiskANN,   │
│          GPU (CAGRA)            │
│  Sparse-BM25 : Natif           │
│  Cloud : Zilliz                 │
│  Sharding : Channel-based       │
│  Multi-vector : Oui             │
└─────────────────────────────────┘

Points forts :
✓ Sparse-BM25 revolutionnaire
✓ GPU acceleration (NVIDIA CAGRA)
✓ Scalabilite horizontale massive
✓ Multi-vector search

Points faibles :
✗ Complexite operationnelle (etcd, MinIO, Pulsar)
✗ RAM elevee
✗ Courbe d'apprentissage

Weaviate : le modulaire

┌─────────────────────────────────┐
│         Weaviate 1.29           │
├─────────────────────────────────┤
│  Langage : Go                   │
│  Index : HNSW + BlockMax WAND   │
│  Modules : text2vec, generative,│
│           reranker, backup      │
│  Multi-tenant : Oui (natif)     │
│  GraphQL API : Oui              │
│  BM25 : Integre                 │
└─────────────────────────────────┘

Points forts :
✓ BlockMax WAND (filtrage rapide)
✓ Architecture modulaire
✓ GraphQL natif
✓ Multi-tenancy avancee

Points faibles :
✗ RAM elevee avec modules
✗ Latence brute > Qdrant
✗ Pricing cloud eleve

Pinecone : le SaaS pur

┌─────────────────────────────────┐
│       Pinecone Serverless       │
├─────────────────────────────────┤
│  Architecture : Proprietaire    │
│  Serverless : Oui               │
│  Sparse vectors : Oui           │
│  Namespaces : Oui               │
│  Metadata filtering : Oui       │
│  Pay-per-query : Oui            │
└─────────────────────────────────┘

Points forts :
✓ Zero operations
✓ Scaling automatique
✓ Pay-per-query economique
✓ SDK polished

Points faibles :
✗ Vendor lock-in total
✗ Pas de self-hosting
✗ Latence plus elevee
✗ Pas de controle sur l'index

Le gagnant par cas d'usage

Cas d'usageGagnantPourquoi
RAG startup / MVPPineconeZero ops, pay-per-query, SDK simple
RAG production (latence critique)Qdrantp99 le plus bas, Rust natif
Recherche hybride (dense + BM25)MilvusSparse-BM25 natif, 30x plus rapide
E-commerce (filtres complexes)WeaviateBlockMax WAND, multi-tenancy
Multi-tenant SaaSQdrant ou WeaviateIsolation native par tenant
Budget serre (100M+ vecteurs)Pinecone ServerlessPay-per-query imbattable a l'echelle
GPU accelerationMilvusSeul a supporter NVIDIA CAGRA
Conformite RGPD (self-hosted EU)QdrantLeger, facile a deployer, Rust

Notre choix chez Ailog

Chez Ailog, nous utilisons Qdrant pour notre infrastructure RAG-as-a-Service. Les raisons :

  1. Latence : nos clients e-commerce exigent des reponses en moins de 100ms
  2. Self-hosted : hebergement souverain en France (RGPD natif)
  3. Multi-tenant : isolation parfaite entre les comptes clients
  4. Rust : faible empreinte memoire = couts serveur reduits

Pour la recherche hybride, nous combinons Qdrant avec notre propre implementation BM25, ce qui nous donne le meilleur des deux mondes. Decouvrez comment nous avons optimise notre pipeline de retrieval et nos strategies de recherche hybride.


Guide de migration

De Pinecone vers Qdrant

DEVELOPERpython
from pinecone import Pinecone from qdrant_client import QdrantClient from qdrant_client.models import VectorParams, Distance, PointStruct # Source : Pinecone pc = Pinecone(api_key="your-key") index = pc.Index("my-index") # Destination : Qdrant qdrant = QdrantClient(host="localhost", port=6333) qdrant.create_collection( collection_name="my-collection", vectors_config=VectorParams(size=1536, distance=Distance.COSINE) ) # Migration par batch batch_size = 100 ids = [] # vos IDs for i in range(0, len(ids), batch_size): batch_ids = ids[i:i+batch_size] results = index.fetch(ids=batch_ids) points = [ PointStruct( id=int(vec_id.replace("-", ""), 16) % (2**63), vector=data["values"], payload=data.get("metadata", {}) ) for vec_id, data in results["vectors"].items() ] qdrant.upsert( collection_name="my-collection", points=points )

De Elasticsearch vers Milvus (hybride)

DEVELOPERpython
from elasticsearch import Elasticsearch from pymilvus import MilvusClient es = Elasticsearch("http://localhost:9200") milvus = MilvusClient(uri="http://localhost:19530") # Scroll Elasticsearch resp = es.search( index="documents", body={"query": {"match_all": {}}, "size": 1000}, scroll="5m" ) while len(resp["hits"]["hits"]) > 0: docs = [] for hit in resp["hits"]["hits"]: docs.append({ "id": hash(hit["_id"]) % (2**63), "text": hit["_source"]["content"], "dense_vector": hit["_source"]["embedding"], # sparse_vector genere automatiquement par BM25 }) milvus.insert(collection_name="documents", data=docs) resp = es.scroll(scroll_id=resp["_scroll_id"], scroll="5m")

Methodologie detaillee

Environnement de test

DEVELOPERyaml
Machine: Scaleway DEV1-XL (Paris) CPU: 8 vCPU (AMD EPYC) RAM: 32 Go DDR4 Stockage: 200 Go NVMe SSD OS: Ubuntu 22.04 LTS Docker: 24.0.7 Reseau: 10 Gbps interne

Datasets

Dataset 1 : Wikipedia FR (1M articles)
- Embeddings : OpenAI text-embedding-3-large (1536d)
- Metadata : categorie, date, langue, longueur
- Taille : 1M vecteurs × 1536d × 4 bytes = 5.7 Go

Dataset 2 : Wikipedia FR + EN (10M passages)
- Meme modele d'embedding
- Chunking : 512 tokens, overlap 50
- Taille : 10M vecteurs × 1536d × 4 bytes = 57 Go

Protocole

  1. Insertion des donnees (mesure du throughput d'ingestion)
  2. Attente stabilisation des index (flush + compaction)
  3. Warmup : 10 000 requetes ignorees
  4. Benchmark : 100 000 requetes, mesure latence + QPS
  5. Repetition 3x, mediane des resultats

FAQ

Pour un projet RAG en production, le choix depend de votre priorite. Si la latence est critique (chatbot temps reel), choisissez **Qdrant**. Si vous avez besoin de recherche hybride avancee (dense + BM25), choisissez **Milvus 2.5**. Si vous voulez zero maintenance, choisissez **Pinecone Serverless**. Si vous faites du e-commerce avec beaucoup de filtres, choisissez **Weaviate**.
Oui, en latence brute. Qdrant en self-hosted affiche un p99 de 8ms contre 32ms pour Pinecone Serverless. Mais Pinecone gagne en facilite d'utilisation et en scaling automatique. La difference de latence est souvent negligeable dans un pipeline RAG complet ou le LLM prend 1-3 secondes.
Pour le cas d'usage specifique de la recherche vectorielle + BM25, oui. Le Sparse-BM25 natif de Milvus 2.5 est 30x plus rapide qu'Elasticsearch pour les requetes hybrides. Cependant, Elasticsearch reste superieur pour l'analytics, le logging, et les aggregations complexes. Si votre seul besoin est le RAG, Milvus peut remplacer Elasticsearch.
En managed cloud : entre $1 200/mois (Pinecone Serverless) et $3 200/mois (Weaviate Cloud). En self-hosted : environ $800-950/mois d'infrastructure, mais ajoutez le cout de l'equipe DevOps. Pour les volumes superieurs a 100M vecteurs, le self-hosting devient generalement plus economique.
Absolument. La quantization binaire reduit la taille memoire de 32x (float32 vers 1 bit) avec une perte de recall de seulement 2-5%. Qdrant et Milvus supportent la quantization scalaire, binaire et produit. C'est la premiere optimisation a activer en production. Consultez notre guide sur l'[optimisation des couts RAG](/blog/guides/rag-cost-optimization) pour plus de details. ---

Conclusion

Le marche des bases vectorielles est plus competitif que jamais en 2026. Chaque solution a trouve son creneau :

  • Qdrant : performance brute, ideal pour le RAG temps reel
  • Milvus 2.5 : recherche hybride revolutionnaire avec Sparse-BM25
  • Weaviate : recherche filtree et modulaire
  • Pinecone : simplicite et scaling sans effort

Le meilleur choix depend de votre contexte. Pour la majorite des projets RAG, commencez avec Pinecone pour le prototypage, puis migrez vers Qdrant ou Milvus pour la production.

Vous voulez tester ces performances dans un vrai systeme RAG ? Creez votre compte Ailog et deployez un chatbot RAG en 5 minutes, sans gerer l'infrastructure vectorielle vous-meme.

Tags

vector databasebenchmarkQdrantPineconeWeaviateMilvusRAGperformance

Articles connexes

Ailog Assistant

Ici pour vous aider

Salut ! Pose-moi des questions sur Ailog et comment intégrer votre RAG dans vos projets !