[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-qdrant-qdrant-hybrid-search-prefetches":3,"mdc--bpz2s0-key":49,"related-org-qdrant-qdrant-hybrid-search-prefetches":502,"related-repo-qdrant-qdrant-hybrid-search-prefetches":651},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":44,"sourceUrl":47,"mdContent":48},"qdrant-hybrid-search-prefetches","configure hybrid search with prefetch queries","Constructing prefetch queries for hybrid retrieval, including sparse\u002Fdense and multi-field setups, and choosing a sparse embedding model. Use when someone asks 'dense and sparse in one search?', 'how to combine multiple fields for retrieval?', 'payloads or sparse vectors for lexical?', 'which sparse embedding model to use?', or 'BM25 vs SPLADE?'",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"qdrant","Qdrant","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fqdrant.png",[12,14,17,20],{"name":9,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Database","database",{"name":18,"slug":19,"type":13},"Search","search",{"name":21,"slug":22,"type":13},"API Development","api-development",197,"https:\u002F\u002Fgithub.com\u002Fqdrant\u002Fskills","2026-07-16T06:03:02.305907",null,23,[29,30,31,32,33,34,35,36,37,38,8,39,40,41,42,43],"agent-skills","ai-agents","claude-code","codex","cursor","embeddings","hybrid-search","monitoring","multitenancy","performance","quantization","scaling","search-quality","vector-database","vector-search",{"repoUrl":24,"stars":23,"forks":27,"topics":45,"description":46},[29,30,31,32,33,34,35,36,37,38,8,39,40,41,42,43],"Agent skills for Qdrant vector search: scaling, performance optimization, search quality, monitoring, deployment, model migration, version upgrades, and SDK usage across Python, TypeScript, Rust, Go, .NET, Java","https:\u002F\u002Fgithub.com\u002Fqdrant\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fqdrant-search-quality\u002Fsearch-strategies\u002Fhybrid-search\u002Fsearch-types","---\nname: qdrant-hybrid-search-prefetches\ndescription: \"Constructing prefetch queries for hybrid retrieval, including sparse\u002Fdense and multi-field setups, and choosing a sparse embedding model. Use when someone asks 'dense and sparse in one search?', 'how to combine multiple fields for retrieval?', 'payloads or sparse vectors for lexical?', 'which sparse embedding model to use?', or 'BM25 vs SPLADE?'\"\n---\n\n# Different Searches in One Query API Request\n\nEach `prefetch` runs exactly one search per one query. \n\nUnderstand if user wants to run several parallel searches on:\n1. The same vector representations but different queries or filters.\n2. Different vector representations but the same raw query.\n\nIf first, help user to design logic of constructing query or\u002Fand filters on application side and then check [Combining Searches](..\u002Fcombining-searches\u002FSKILL.md). Don't forget to create [indices on filterable payload fields](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fmanage-data\u002Findexing\u002F?s=payload-index), immediately after collection creation, prior to building HNSW, so filterable HNSW could be constructed.\n\nIf second, use [named vectors](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fmanage-data\u002Fvectors\u002F?s=named-vectors), which allow to store multiple vector types per point in one collection. Beware that named vectors currently can be configured only at collection creation. To choose vectors, check following recommendations.\n\n## Missed Keyword Matches\n\nUse when: pure vector search misses exact term or keyword matches and you need lexical retrieval alongside semantic search.\n\nMost likely you need a sparse vector for exact text search alongside the dense one. Qdrant uses sparse vectors for lexical searches, as [payload filtering doesn't provide any ranking score](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fsearch\u002Ftext-search\u002F?s=filtering-versus-querying).\n\n### Choose a Sparse Vector for Text\n- **BM25** statistical representations, built into Qdrant core (computed server-side). Good baseline, works out-of-domain, usually for long texts. Can be used for non-English content, but needs to be configured per language (tokenization, stemming, stopwords, etc) at indexing and retrieval time. More in [Text Search Guide](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fsearch\u002Ftext-search\u002Ffull-text-search\u002F?s=bm25)\n- **BM42** learned sparse, based on BM25, but better for small chunks of text & with meaning understanding. Works only on English. Requires fine-tuning for domain-specific retrieval. Requires FastEmbed (Python\u002FREST only, not available in all SDKs). Not maintained. \n- **miniCOIL** learned sparse, BM25 with additional understanding of words meaning in context. Works only on English. Requires fine-tuning for domain-specific retrieval. Requires FastEmbed. Usage shown in [FastEmbed miniCOIL documentation](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Ffastembed\u002Ffastembed-minicoil\u002F).\n- **SPLADE++** learned sparse with term expansion. Heavier inference and resources usage but better performance due to term expansion. Requires fine-tuning for domain-specific retrieval. Provided in Qdrant Cloud Inference and FastEmbed versions work only on English. To use with FastEmbed, check [FastEmbed SPLADE documentation](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Ffastembed\u002Ffastembed-splade\u002F).\n- **External learned sparse embeddings**, for example BAAI\u002Fbge-m3.\n\nWhat to remember when using sparse vectors for lexical search:\n- tokenization and stemming affect exact matches, especially on custom codes, terms, etc.\n\nWhat to remember when using Qdrant BM25 and miniCOIL (based on BM25):\n- `avg_len` in formula is not computed server-side, it is a user responsibility and passed as a parameter. Calibrate per field — defaults assume document-length text; short fields (titles, tags) need a much smaller value or BM25 scoring is skewed (`avg_len=256` against a 10-word title overweights term frequency).\n- BM25 might be not good for small chunks of text, as BM25 algorithm was initially created for search on long documents; consider adjusting document statistics in sparse vectors (TF & IDF, k, b).\n- Qdrant BM25 vectors are configured per language, so consider customizing stop words, stemming & tokenization when users documents mix several languages or carefully configure vectors per point when they are monolingual.\n\nMore on [Sparse Vectors for Text Search](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fcourse\u002Fessentials\u002Fday-3\u002Fsparse-retrieval-demo\u002F)\n\n## Need to Combine Multiple Representations of the Same Item\n\nUse when: the same item is embedded in multiple ways (e.g. different models, languages, modalities, or different fields like title\u002Fabstract\u002Fchunk) and you want to search across different representations in one request (don't have to be all of them, can be even one).\n\nUse multiple named vector prefetches, each prefetch covers one representation.\n\nA representation only earns its own prefetch if it carries signal independent of the others — e.g. title vocabulary the body never repeats, or an abstract treated as a single semantic unit vs. individual chunks. Don't add a prefetch per field reflexively; verify each candidate contributes content the other vectors don't.\n\nWhen a representation's signal is mostly lexical — keyword-driven titles, codes, tags, or other short fields — prefer a sparse named vector (e.g. BM25) over an additional dense embedding. Server-side BM25 in Qdrant avoids the inference cost of another dense model and stores far less per point. Skip this when the field carries paraphrase or conceptual signal that exact-term matching would miss.\n\n- End-to-end worked example fusing title, abstract, chunk, and sparse-title named vectors with RRF and document-level grouping in one Query API call: [Multi-Representation Search tutorial](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Ftutorials-search-engineering\u002Fmulti-representation-search\u002F)\n- If you have groups and subgroups of representations (document -> chunk, image -> patch), you could use [searching in groups](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fsearch\u002Fsearch\u002F?s=search-groups). To not store identical payloads several times, check [Lookup in Groups](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fsearch\u002Fsearch\u002F#lookup-in-groups). Index the grouping payload field (e.g. `document_id`) as a keyword payload index before grouping.\n- When grouping chunk-level points back to documents, each prefetch only contributes the candidates it returned — so size per-prefetch `limit` well above the final document `limit` (rule of thumb: `prefetch_limit ≥ final_limit × expected_chunks_per_document`), otherwise a few documents with many chunks saturate the candidate pool and relevant documents drop silently. Validate grouped recall on a labeled sample.\n- When per-document vectors (title, abstract) would be duplicated across every chunk-level point, the duplication can dominate storage at scale. Keeping them denormalized in one collection makes queries simpler (single Query API call, every representation reachable from any point); a sidecar collection joined via [Lookup in Groups](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fsearch\u002Fsearch\u002F#lookup-in-groups) is the alternative when storage matters.\n\nYou can also search directly on [multivectors](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fmanage-data\u002Fvectors\u002F?s=multivectors), a matrix of dense vectors, in a prefetch.\n\nHowever, it comes with several considerations, as multivectors were designed to support late interaction models using max similarity metric, so it's impossible to retrieve the list of individual max similarity scores for each query vector.\n\nMoreover, multivectors are rarely a good pick for prefetch:\n- max similarity metric is not symmetric, so [using HNSW index with it could be problematic](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fcourse\u002Fmulti-vector-search\u002Fmodule-1\u002Fmaxsim-distance\u002F#the-hnsw-challenge)\n- [multivector representations are very heavy, as search process on them](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fcourse\u002Fmulti-vector-search\u002Fmodule-1\u002Fproblems-multi-vector). \n\nThere are ways to make multivector retrieval cheaper (MUVERA, pooling), you can see more in [\"Evaluating Tradeoffs of Multi-stage Multi-vector Search\"](https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fcourse\u002Fmulti-vector-search\u002Fmodule-3\u002Fevaluating-pipelines\u002F)\n\n## What NOT to Do\n- Choose any search method (for example, BM25) without evaluation of its quality & resources used.\n- Use any search method (for example, BM25) without paying attention to the specifics of their configuration and applicability to the use case.\n\n",{"data":50,"body":51},{"name":4,"description":6},{"type":52,"children":53},"root",[54,63,78,83,98,122,136,143,148,162,169,247,252,260,265,297,309,315,320,325,330,335,421,435,440,445,471,483,489],{"type":55,"tag":56,"props":57,"children":59},"element","h1",{"id":58},"different-searches-in-one-query-api-request",[60],{"type":61,"value":62},"text","Different Searches in One Query API Request",{"type":55,"tag":64,"props":65,"children":66},"p",{},[67,69,76],{"type":61,"value":68},"Each ",{"type":55,"tag":70,"props":71,"children":73},"code",{"className":72},[],[74],{"type":61,"value":75},"prefetch",{"type":61,"value":77}," runs exactly one search per one query.",{"type":55,"tag":64,"props":79,"children":80},{},[81],{"type":61,"value":82},"Understand if user wants to run several parallel searches on:",{"type":55,"tag":84,"props":85,"children":86},"ol",{},[87,93],{"type":55,"tag":88,"props":89,"children":90},"li",{},[91],{"type":61,"value":92},"The same vector representations but different queries or filters.",{"type":55,"tag":88,"props":94,"children":95},{},[96],{"type":61,"value":97},"Different vector representations but the same raw query.",{"type":55,"tag":64,"props":99,"children":100},{},[101,103,110,112,120],{"type":61,"value":102},"If first, help user to design logic of constructing query or\u002Fand filters on application side and then check ",{"type":55,"tag":104,"props":105,"children":107},"a",{"href":106},"..\u002Fcombining-searches\u002FSKILL.md",[108],{"type":61,"value":109},"Combining Searches",{"type":61,"value":111},". Don't forget to create ",{"type":55,"tag":104,"props":113,"children":117},{"href":114,"rel":115},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fmanage-data\u002Findexing\u002F?s=payload-index",[116],"nofollow",[118],{"type":61,"value":119},"indices on filterable payload fields",{"type":61,"value":121},", immediately after collection creation, prior to building HNSW, so filterable HNSW could be constructed.",{"type":55,"tag":64,"props":123,"children":124},{},[125,127,134],{"type":61,"value":126},"If second, use ",{"type":55,"tag":104,"props":128,"children":131},{"href":129,"rel":130},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fmanage-data\u002Fvectors\u002F?s=named-vectors",[116],[132],{"type":61,"value":133},"named vectors",{"type":61,"value":135},", which allow to store multiple vector types per point in one collection. Beware that named vectors currently can be configured only at collection creation. To choose vectors, check following recommendations.",{"type":55,"tag":137,"props":138,"children":140},"h2",{"id":139},"missed-keyword-matches",[141],{"type":61,"value":142},"Missed Keyword Matches",{"type":55,"tag":64,"props":144,"children":145},{},[146],{"type":61,"value":147},"Use when: pure vector search misses exact term or keyword matches and you need lexical retrieval alongside semantic search.",{"type":55,"tag":64,"props":149,"children":150},{},[151,153,160],{"type":61,"value":152},"Most likely you need a sparse vector for exact text search alongside the dense one. Qdrant uses sparse vectors for lexical searches, as ",{"type":55,"tag":104,"props":154,"children":157},{"href":155,"rel":156},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fsearch\u002Ftext-search\u002F?s=filtering-versus-querying",[116],[158],{"type":61,"value":159},"payload filtering doesn't provide any ranking score",{"type":61,"value":161},".",{"type":55,"tag":163,"props":164,"children":166},"h3",{"id":165},"choose-a-sparse-vector-for-text",[167],{"type":61,"value":168},"Choose a Sparse Vector for Text",{"type":55,"tag":170,"props":171,"children":172},"ul",{},[173,191,201,219,237],{"type":55,"tag":88,"props":174,"children":175},{},[176,182,184],{"type":55,"tag":177,"props":178,"children":179},"strong",{},[180],{"type":61,"value":181},"BM25",{"type":61,"value":183}," statistical representations, built into Qdrant core (computed server-side). Good baseline, works out-of-domain, usually for long texts. Can be used for non-English content, but needs to be configured per language (tokenization, stemming, stopwords, etc) at indexing and retrieval time. More in ",{"type":55,"tag":104,"props":185,"children":188},{"href":186,"rel":187},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fsearch\u002Ftext-search\u002Ffull-text-search\u002F?s=bm25",[116],[189],{"type":61,"value":190},"Text Search Guide",{"type":55,"tag":88,"props":192,"children":193},{},[194,199],{"type":55,"tag":177,"props":195,"children":196},{},[197],{"type":61,"value":198},"BM42",{"type":61,"value":200}," learned sparse, based on BM25, but better for small chunks of text & with meaning understanding. Works only on English. Requires fine-tuning for domain-specific retrieval. Requires FastEmbed (Python\u002FREST only, not available in all SDKs). Not maintained.",{"type":55,"tag":88,"props":202,"children":203},{},[204,209,211,218],{"type":55,"tag":177,"props":205,"children":206},{},[207],{"type":61,"value":208},"miniCOIL",{"type":61,"value":210}," learned sparse, BM25 with additional understanding of words meaning in context. Works only on English. Requires fine-tuning for domain-specific retrieval. Requires FastEmbed. Usage shown in ",{"type":55,"tag":104,"props":212,"children":215},{"href":213,"rel":214},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Ffastembed\u002Ffastembed-minicoil\u002F",[116],[216],{"type":61,"value":217},"FastEmbed miniCOIL documentation",{"type":61,"value":161},{"type":55,"tag":88,"props":220,"children":221},{},[222,227,229,236],{"type":55,"tag":177,"props":223,"children":224},{},[225],{"type":61,"value":226},"SPLADE++",{"type":61,"value":228}," learned sparse with term expansion. Heavier inference and resources usage but better performance due to term expansion. Requires fine-tuning for domain-specific retrieval. Provided in Qdrant Cloud Inference and FastEmbed versions work only on English. To use with FastEmbed, check ",{"type":55,"tag":104,"props":230,"children":233},{"href":231,"rel":232},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Ffastembed\u002Ffastembed-splade\u002F",[116],[234],{"type":61,"value":235},"FastEmbed SPLADE documentation",{"type":61,"value":161},{"type":55,"tag":88,"props":238,"children":239},{},[240,245],{"type":55,"tag":177,"props":241,"children":242},{},[243],{"type":61,"value":244},"External learned sparse embeddings",{"type":61,"value":246},", for example BAAI\u002Fbge-m3.",{"type":55,"tag":64,"props":248,"children":249},{},[250],{"type":61,"value":251},"What to remember when using sparse vectors for lexical search:",{"type":55,"tag":170,"props":253,"children":254},{},[255],{"type":55,"tag":88,"props":256,"children":257},{},[258],{"type":61,"value":259},"tokenization and stemming affect exact matches, especially on custom codes, terms, etc.",{"type":55,"tag":64,"props":261,"children":262},{},[263],{"type":61,"value":264},"What to remember when using Qdrant BM25 and miniCOIL (based on BM25):",{"type":55,"tag":170,"props":266,"children":267},{},[268,287,292],{"type":55,"tag":88,"props":269,"children":270},{},[271,277,279,285],{"type":55,"tag":70,"props":272,"children":274},{"className":273},[],[275],{"type":61,"value":276},"avg_len",{"type":61,"value":278}," in formula is not computed server-side, it is a user responsibility and passed as a parameter. Calibrate per field — defaults assume document-length text; short fields (titles, tags) need a much smaller value or BM25 scoring is skewed (",{"type":55,"tag":70,"props":280,"children":282},{"className":281},[],[283],{"type":61,"value":284},"avg_len=256",{"type":61,"value":286}," against a 10-word title overweights term frequency).",{"type":55,"tag":88,"props":288,"children":289},{},[290],{"type":61,"value":291},"BM25 might be not good for small chunks of text, as BM25 algorithm was initially created for search on long documents; consider adjusting document statistics in sparse vectors (TF & IDF, k, b).",{"type":55,"tag":88,"props":293,"children":294},{},[295],{"type":61,"value":296},"Qdrant BM25 vectors are configured per language, so consider customizing stop words, stemming & tokenization when users documents mix several languages or carefully configure vectors per point when they are monolingual.",{"type":55,"tag":64,"props":298,"children":299},{},[300,302],{"type":61,"value":301},"More on ",{"type":55,"tag":104,"props":303,"children":306},{"href":304,"rel":305},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fcourse\u002Fessentials\u002Fday-3\u002Fsparse-retrieval-demo\u002F",[116],[307],{"type":61,"value":308},"Sparse Vectors for Text Search",{"type":55,"tag":137,"props":310,"children":312},{"id":311},"need-to-combine-multiple-representations-of-the-same-item",[313],{"type":61,"value":314},"Need to Combine Multiple Representations of the Same Item",{"type":55,"tag":64,"props":316,"children":317},{},[318],{"type":61,"value":319},"Use when: the same item is embedded in multiple ways (e.g. different models, languages, modalities, or different fields like title\u002Fabstract\u002Fchunk) and you want to search across different representations in one request (don't have to be all of them, can be even one).",{"type":55,"tag":64,"props":321,"children":322},{},[323],{"type":61,"value":324},"Use multiple named vector prefetches, each prefetch covers one representation.",{"type":55,"tag":64,"props":326,"children":327},{},[328],{"type":61,"value":329},"A representation only earns its own prefetch if it carries signal independent of the others — e.g. title vocabulary the body never repeats, or an abstract treated as a single semantic unit vs. individual chunks. Don't add a prefetch per field reflexively; verify each candidate contributes content the other vectors don't.",{"type":55,"tag":64,"props":331,"children":332},{},[333],{"type":61,"value":334},"When a representation's signal is mostly lexical — keyword-driven titles, codes, tags, or other short fields — prefer a sparse named vector (e.g. BM25) over an additional dense embedding. Server-side BM25 in Qdrant avoids the inference cost of another dense model and stores far less per point. Skip this when the field carries paraphrase or conceptual signal that exact-term matching would miss.",{"type":55,"tag":170,"props":336,"children":337},{},[338,350,381,409],{"type":55,"tag":88,"props":339,"children":340},{},[341,343],{"type":61,"value":342},"End-to-end worked example fusing title, abstract, chunk, and sparse-title named vectors with RRF and document-level grouping in one Query API call: ",{"type":55,"tag":104,"props":344,"children":347},{"href":345,"rel":346},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Ftutorials-search-engineering\u002Fmulti-representation-search\u002F",[116],[348],{"type":61,"value":349},"Multi-Representation Search tutorial",{"type":55,"tag":88,"props":351,"children":352},{},[353,355,362,364,371,373,379],{"type":61,"value":354},"If you have groups and subgroups of representations (document -> chunk, image -> patch), you could use ",{"type":55,"tag":104,"props":356,"children":359},{"href":357,"rel":358},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fsearch\u002Fsearch\u002F?s=search-groups",[116],[360],{"type":61,"value":361},"searching in groups",{"type":61,"value":363},". To not store identical payloads several times, check ",{"type":55,"tag":104,"props":365,"children":368},{"href":366,"rel":367},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fsearch\u002Fsearch\u002F#lookup-in-groups",[116],[369],{"type":61,"value":370},"Lookup in Groups",{"type":61,"value":372},". Index the grouping payload field (e.g. ",{"type":55,"tag":70,"props":374,"children":376},{"className":375},[],[377],{"type":61,"value":378},"document_id",{"type":61,"value":380},") as a keyword payload index before grouping.",{"type":55,"tag":88,"props":382,"children":383},{},[384,386,392,394,399,401,407],{"type":61,"value":385},"When grouping chunk-level points back to documents, each prefetch only contributes the candidates it returned — so size per-prefetch ",{"type":55,"tag":70,"props":387,"children":389},{"className":388},[],[390],{"type":61,"value":391},"limit",{"type":61,"value":393}," well above the final document ",{"type":55,"tag":70,"props":395,"children":397},{"className":396},[],[398],{"type":61,"value":391},{"type":61,"value":400}," (rule of thumb: ",{"type":55,"tag":70,"props":402,"children":404},{"className":403},[],[405],{"type":61,"value":406},"prefetch_limit ≥ final_limit × expected_chunks_per_document",{"type":61,"value":408},"), otherwise a few documents with many chunks saturate the candidate pool and relevant documents drop silently. Validate grouped recall on a labeled sample.",{"type":55,"tag":88,"props":410,"children":411},{},[412,414,419],{"type":61,"value":413},"When per-document vectors (title, abstract) would be duplicated across every chunk-level point, the duplication can dominate storage at scale. Keeping them denormalized in one collection makes queries simpler (single Query API call, every representation reachable from any point); a sidecar collection joined via ",{"type":55,"tag":104,"props":415,"children":417},{"href":366,"rel":416},[116],[418],{"type":61,"value":370},{"type":61,"value":420}," is the alternative when storage matters.",{"type":55,"tag":64,"props":422,"children":423},{},[424,426,433],{"type":61,"value":425},"You can also search directly on ",{"type":55,"tag":104,"props":427,"children":430},{"href":428,"rel":429},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fdocumentation\u002Fmanage-data\u002Fvectors\u002F?s=multivectors",[116],[431],{"type":61,"value":432},"multivectors",{"type":61,"value":434},", a matrix of dense vectors, in a prefetch.",{"type":55,"tag":64,"props":436,"children":437},{},[438],{"type":61,"value":439},"However, it comes with several considerations, as multivectors were designed to support late interaction models using max similarity metric, so it's impossible to retrieve the list of individual max similarity scores for each query vector.",{"type":55,"tag":64,"props":441,"children":442},{},[443],{"type":61,"value":444},"Moreover, multivectors are rarely a good pick for prefetch:",{"type":55,"tag":170,"props":446,"children":447},{},[448,460],{"type":55,"tag":88,"props":449,"children":450},{},[451,453],{"type":61,"value":452},"max similarity metric is not symmetric, so ",{"type":55,"tag":104,"props":454,"children":457},{"href":455,"rel":456},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fcourse\u002Fmulti-vector-search\u002Fmodule-1\u002Fmaxsim-distance\u002F#the-hnsw-challenge",[116],[458],{"type":61,"value":459},"using HNSW index with it could be problematic",{"type":55,"tag":88,"props":461,"children":462},{},[463,470],{"type":55,"tag":104,"props":464,"children":467},{"href":465,"rel":466},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fcourse\u002Fmulti-vector-search\u002Fmodule-1\u002Fproblems-multi-vector",[116],[468],{"type":61,"value":469},"multivector representations are very heavy, as search process on them",{"type":61,"value":161},{"type":55,"tag":64,"props":472,"children":473},{},[474,476],{"type":61,"value":475},"There are ways to make multivector retrieval cheaper (MUVERA, pooling), you can see more in ",{"type":55,"tag":104,"props":477,"children":480},{"href":478,"rel":479},"https:\u002F\u002Fskills.qdrant.tech\u002Fmd\u002Fcourse\u002Fmulti-vector-search\u002Fmodule-3\u002Fevaluating-pipelines\u002F",[116],[481],{"type":61,"value":482},"\"Evaluating Tradeoffs of Multi-stage Multi-vector Search\"",{"type":55,"tag":137,"props":484,"children":486},{"id":485},"what-not-to-do",[487],{"type":61,"value":488},"What NOT to Do",{"type":55,"tag":170,"props":490,"children":491},{},[492,497],{"type":55,"tag":88,"props":493,"children":494},{},[495],{"type":61,"value":496},"Choose any search method (for example, BM25) without evaluation of its quality & resources used.",{"type":55,"tag":88,"props":498,"children":499},{},[500],{"type":61,"value":501},"Use any search method (for example, BM25) without paying attention to the specifics of their configuration and applicability to the use case.",{"items":503,"total":650},[504,519,532,547,560,574,587,597,604,616,626,637],{"slug":505,"name":505,"fn":506,"description":507,"org":508,"tags":509,"stars":23,"repoUrl":24,"updatedAt":518},"qdrant-advisor","diagnose and troubleshoot Qdrant deployments","Diagnose, troubleshoot, and advise on any Qdrant deployment by loading the latest official Qdrant skills live from skills.qdrant.tech. Use this whenever someone raises a Qdrant problem or question — slow or degraded search, high or growing memory \u002F OOM crashes, optimizer stuck or slow, indexing slowness, scaling and sharding decisions (node count, QPS, latency, multitenancy, vertical vs horizontal), poor or irrelevant search results, hybrid search and reranking, embedding-model migration, version upgrades and compatibility, monitoring and observability (Prometheus, Grafana, health checks, \u002Fmetrics, \u002Ftelemetry), deployment choices (local, Docker, self-hosted, Qdrant Cloud, embedded), or client-SDK questions (Python, TypeScript, Rust, Go, .NET, Java). Trigger especially when the context is clearly a Qdrant cluster, collection, or vector-search deployment. Always prefer this skill over answering from memory: it pulls current, authoritative guidance and only the relevant context.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[510,511,514,517],{"name":15,"slug":16,"type":13},{"name":512,"slug":513,"type":13},"Debugging","debugging",{"name":515,"slug":516,"type":13},"Operations","operations",{"name":9,"slug":8,"type":13},"2026-07-16T06:02:56.675293",{"slug":520,"name":520,"fn":521,"description":522,"org":523,"tags":524,"stars":23,"repoUrl":24,"updatedAt":531},"qdrant-clients-sdk","integrate Qdrant client SDKs","Qdrant provides client SDKs for various programming languages, allowing easy integration with Qdrant deployments.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[525,526,527,528],{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":529,"slug":530,"type":13},"SDK","sdk","2026-07-16T05:59:57.799789",{"slug":533,"name":533,"fn":534,"description":535,"org":536,"tags":537,"stars":23,"repoUrl":24,"updatedAt":546},"qdrant-deployment-options","select Qdrant deployment options","Guides Qdrant deployment selection. Use when someone asks 'how to deploy Qdrant', 'Docker vs Cloud', 'local mode', 'embedded Qdrant', 'Qdrant EDGE', 'which deployment option', 'self-hosted vs cloud', or 'need lowest latency deployment'. Also use when choosing between deployment types for a new project.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[538,539,542,545],{"name":15,"slug":16,"type":13},{"name":540,"slug":541,"type":13},"Deployment","deployment",{"name":543,"slug":544,"type":13},"Infrastructure","infrastructure",{"name":9,"slug":8,"type":13},"2026-07-19T05:38:33.324265",{"slug":548,"name":548,"fn":549,"description":550,"org":551,"tags":552,"stars":23,"repoUrl":24,"updatedAt":559},"qdrant-edge","build applications with Qdrant Edge","Guides building on Qdrant Edge, the embedded in-process shard. Use when someone asks 'how to sync Edge with the server', 'keep a local shard in sync with Qdrant Cloud', 'BM25 or keyword search on Edge', 'hybrid search on Edge', 'embeddings on device', 'Edge snapshots', 'apply a partial snapshot', 'why is my Edge search empty after inserts', or is writing custom sync, BM25, or fusion code against qdrant-edge. Also use when deciding what Edge ships built-in versus what you must implement.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[553,554,557,558],{"name":15,"slug":16,"type":13},{"name":555,"slug":556,"type":13},"Edge","edge",{"name":9,"slug":8,"type":13},{"name":18,"slug":19,"type":13},"2026-07-16T06:01:19.179105",{"slug":561,"name":561,"fn":562,"description":563,"org":564,"tags":565,"stars":23,"repoUrl":24,"updatedAt":573},"qdrant-horizontal-scaling","guide Qdrant horizontal scaling decisions","Diagnoses and guides Qdrant horizontal scaling decisions. Use when someone asks 'vertical or horizontal?', 'how many nodes?', 'how many shards?', 'how to add nodes', 'resharding', 'data doesn't fit', or 'need more capacity'. Also use when data growth outpaces current deployment.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[566,569,570,571],{"name":567,"slug":568,"type":13},"Architecture","architecture",{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":572,"slug":40,"type":13},"Scaling","2026-07-19T05:38:32.348551",{"slug":575,"name":575,"fn":576,"description":577,"org":578,"tags":579,"stars":23,"repoUrl":24,"updatedAt":586},"qdrant-hybrid-search","implement hybrid search in Qdrant","Explains hybrid search in Qdrant. Use when someone asks 'how do I setup hybrid search?', 'how to combine keyword and semantic search?', 'sparse plus dense vectors?', 'missing keyword matches', 'how to combine results from multiple searches?' and 'combining multiple representations'",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[580,583,584,585],{"name":581,"slug":582,"type":13},"AI Infrastructure","ai-infrastructure",{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":18,"slug":19,"type":13},"2026-07-16T06:00:12.328122",{"slug":588,"name":588,"fn":589,"description":590,"org":591,"tags":592,"stars":23,"repoUrl":24,"updatedAt":596},"qdrant-hybrid-search-combining","combine hybrid search scores in Qdrant","Fusing scores from multiple searches into a single ranked result (RRF, DBSF, custom fusion). Use when someone asks 'RRF or DBSF?', 'how to combine sparse and dense', 'how to combine scores from multiple searches?', 'custom fusion', or 'fusion is not producing good results'",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[593,594,595],{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":18,"slug":19,"type":13},"2026-07-16T06:01:49.401142",{"slug":4,"name":4,"fn":5,"description":6,"org":598,"tags":599,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[600,601,602,603],{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":18,"slug":19,"type":13},{"slug":605,"name":605,"fn":606,"description":607,"org":608,"tags":609,"stars":23,"repoUrl":24,"updatedAt":615},"qdrant-indexing-performance-optimization","optimize Qdrant indexing and data ingestion","Diagnoses and fixes slow Qdrant indexing and data ingestion. Use when someone reports 'uploads are slow', 'indexing takes forever', 'optimizer is stuck', 'HNSW build time too long', or 'data uploaded but search is bad'. Also use when optimizer status shows errors, segments won't merge, or indexing threshold questions arise.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[610,611,612,614],{"name":15,"slug":16,"type":13},{"name":512,"slug":513,"type":13},{"name":613,"slug":38,"type":13},"Performance",{"name":9,"slug":8,"type":13},"2026-07-19T05:38:36.321999",{"slug":617,"name":617,"fn":618,"description":619,"org":620,"tags":621,"stars":23,"repoUrl":24,"updatedAt":625},"qdrant-memory-usage-optimization","optimize Qdrant memory usage","Diagnoses and reduces Qdrant memory usage. Use when someone reports 'memory too high', 'RAM keeps growing', 'node crashed', 'out of memory', 'memory leak', or asks 'why is memory usage so high?', 'how to reduce RAM?'. Also use when memory doesn't match calculations, quantization didn't help, or nodes crash during recovery.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[622,623,624],{"name":512,"slug":513,"type":13},{"name":613,"slug":38,"type":13},{"name":9,"slug":8,"type":13},"2026-07-16T06:00:15.357243",{"slug":627,"name":627,"fn":628,"description":629,"org":630,"tags":631,"stars":23,"repoUrl":24,"updatedAt":636},"qdrant-minimize-latency","optimize Qdrant query latency","Guides Qdrant query latency optimization. Use when someone asks 'search is slow', 'how to reduce latency', 'p99 is too high', 'tail latency', 'single query too slow', 'how to make search faster', or 'latency spikes'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[632,633,634,635],{"name":15,"slug":16,"type":13},{"name":512,"slug":513,"type":13},{"name":613,"slug":38,"type":13},{"name":9,"slug":8,"type":13},"2026-07-16T05:59:17.325839",{"slug":638,"name":638,"fn":639,"description":640,"org":641,"tags":642,"stars":23,"repoUrl":24,"updatedAt":649},"qdrant-model-migration","migrate embedding models in Qdrant","Guides embedding model migration in Qdrant without downtime. Use when someone asks 'how to switch embedding models', 'how to migrate vectors', 'how to update to a new model', 'zero-downtime model change', 'how to re-embed my data', or 'can I use two models at once'. Also use when upgrading model dimensions, switching providers, or A\u002FB testing models.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[643,644,647,648],{"name":15,"slug":16,"type":13},{"name":645,"slug":646,"type":13},"Migration","migration",{"name":613,"slug":38,"type":13},{"name":9,"slug":8,"type":13},"2026-07-16T06:00:48.841055",30,{"items":652,"total":650},[653,660,667,674,681,688,695],{"slug":505,"name":505,"fn":506,"description":507,"org":654,"tags":655,"stars":23,"repoUrl":24,"updatedAt":518},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[656,657,658,659],{"name":15,"slug":16,"type":13},{"name":512,"slug":513,"type":13},{"name":515,"slug":516,"type":13},{"name":9,"slug":8,"type":13},{"slug":520,"name":520,"fn":521,"description":522,"org":661,"tags":662,"stars":23,"repoUrl":24,"updatedAt":531},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[663,664,665,666],{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":529,"slug":530,"type":13},{"slug":533,"name":533,"fn":534,"description":535,"org":668,"tags":669,"stars":23,"repoUrl":24,"updatedAt":546},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[670,671,672,673],{"name":15,"slug":16,"type":13},{"name":540,"slug":541,"type":13},{"name":543,"slug":544,"type":13},{"name":9,"slug":8,"type":13},{"slug":548,"name":548,"fn":549,"description":550,"org":675,"tags":676,"stars":23,"repoUrl":24,"updatedAt":559},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[677,678,679,680],{"name":15,"slug":16,"type":13},{"name":555,"slug":556,"type":13},{"name":9,"slug":8,"type":13},{"name":18,"slug":19,"type":13},{"slug":561,"name":561,"fn":562,"description":563,"org":682,"tags":683,"stars":23,"repoUrl":24,"updatedAt":573},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[684,685,686,687],{"name":567,"slug":568,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":572,"slug":40,"type":13},{"slug":575,"name":575,"fn":576,"description":577,"org":689,"tags":690,"stars":23,"repoUrl":24,"updatedAt":586},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[691,692,693,694],{"name":581,"slug":582,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":18,"slug":19,"type":13},{"slug":588,"name":588,"fn":589,"description":590,"org":696,"tags":697,"stars":23,"repoUrl":24,"updatedAt":596},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[698,699,700],{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":18,"slug":19,"type":13}]