Diagnoses Qdrant search quality issues. Use when someone reports 'results are bad', 'wrong results', 'not relevant results', 'missing matches', 'recall is low', 'approximate search worse than exact', 'which embedding model', 'quality dropped after quantization', 'how to measure retrieval quality', 'build a golden set', 'ground truth dataset', or 'how to score recall@k'. Also use when search quality degrades without obvious changes.
Before diagnosing or evaluating search quality, establish two different ground truths: a labeled query set measures whether the results are the right ones; exact KNN measures whether ANN finds what brute force would (no labels needed). The first diagnoses relevance, the second diagnoses the index.
Use when: user has no golden set, asks "how do I know if my search is good?", or needs to gate releases on a retrieval metric. Every fix in the sections below should be validated this way.
Recall@k for RAG, MRR/Hits@1 for single-answer, NDCG@k for re-ranking Choosing the metricranx Measuring Retrieval RelevanceUse when: results are irrelevant or missing expected matches and you need to isolate the cause.
recall@k Web UI ANN Recallexact=true. Compute recall@k from the overlap ANN recall in CIrecall@k in production. Exact search bad = model, data, or search pipeline problem. Exact good, approximate bad = tune HNSW.Payload filtering and ranked text search are different things. Metadata (dates, categories, tags) goes in payload for filtering. To rank text content, on Qdrant 1.20 or newer use BM25 on a full-text index with scoring enabled (queried with a text query); on older versions, or for learned sparse models, use sparse vectors. A full-text index without scoring only filters.
Use when: exact search returns good results but HNSW approximation misses them.
hnsw_ef controls ANN search breadth; increase it while recall is still climbing, stop at the lowest value that hits your recall target inside your latency budget Search params Raise hnsw_ef only when recall is still climbingef_construct (200+ for high quality) HNSW configm (16 default, 32 for high recall) HNSW configBinary quantization requires rescore. Without it, quality loss is severe. Use oversampling to recover recall: the docs report 0.98 recall with 2x oversampling on 4096-dimensional and 4x on 1536-dimensional embeddings, so start around 2-4x and tune on your data. Always test quantization impact on your data before production. Quantization
Use when: exact search also returns bad results.
Check Qdrant team recommendations on how to choose an embedding model.
Test top 3 MTEB models on 100-1000 sample queries Hosted Qdrant inference. Score them against a labeled set to compare apples to apples Measuring Retrieval Relevance.
If your data is strongly hierarchical (taxonomies, product catalogs, part-whole relationships), consider hyperbolic (Poincaré) embeddings. They capture tree structure in far fewer dimensions than flat ones. In Qdrant, use Euclidean HNSW to pull a candidate set from the original Poincaré coordinates, then a Formula Query to rescore with the real hyperbolic distance. How to serve hyperbolic embeddings with Qdrant.
Consider fine-tuning an embedding model for your specific use case only after trying better-suited models and retrieval/pipeline tuning and confirming that the embedding model remains the bottleneck. Fine-tuning is most useful when general-purpose embeddings fail to capture important domain- or task-specific distinctions and you have good labeled query-document pairs. Fine-tuning requires re-embedding and re-indexing the collection Model migration.
Use when: exact search also returns bad results and model choice is confirmed by user.
limit=100-200 and test larger values against your labeled queries Candidate depthhnsw_ef lower than results requested (guaranteed bad recall)skillbazaar install qdrant-search-quality-diagnosis --agent claudeSign in (free) to install skills with the CLI.
Author
@qdrant
on GitHub
Published by