<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Migration Guidance on Qdrant - Vector Search Engine</title><link>https://deploy-preview-2342--condescending-goldwasser-91acf0.netlify.app/documentation/migration-guidance/</link><description>Recent content in Migration Guidance on Qdrant - Vector Search Engine</description><generator>Hugo</generator><language>en-us</language><managingEditor>info@qdrant.tech (Andrey Vasnetsov)</managingEditor><webMaster>info@qdrant.tech (Andrey Vasnetsov)</webMaster><atom:link href="https://deploy-preview-2342--condescending-goldwasser-91acf0.netlify.app/documentation/migration-guidance/index.xml" rel="self" type="application/rss+xml"/><item><title>Pre-Migration Baseline</title><link>https://deploy-preview-2342--condescending-goldwasser-91acf0.netlify.app/documentation/migration-guidance/pre-migration-baseline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>info@qdrant.tech (Andrey Vasnetsov)</author><guid>https://deploy-preview-2342--condescending-goldwasser-91acf0.netlify.app/documentation/migration-guidance/pre-migration-baseline/</guid><description>&lt;h1 id="pre-migration-baseline"&gt;Pre-Migration Baseline&lt;/h1&gt;
&lt;p&gt;Establishing a baseline is paramount for migration verification. If you don&amp;rsquo;t capture what &amp;ldquo;correct&amp;rdquo; looks like before you migrate, you have nothing to compare against afterward. This page covers what to record from your source system before starting the migration.&lt;/p&gt;
&lt;h2 id="what-to-capture"&gt;What to Capture&lt;/h2&gt;
&lt;p&gt;There are four pieces of information that need to be accounted for when establishing a baseline: collection/index inventory, metadata samples, baseline search results, and system configuration snapshots.&lt;/p&gt;</description></item><item><title>Data Integrity</title><link>https://deploy-preview-2342--condescending-goldwasser-91acf0.netlify.app/documentation/migration-guidance/data-integrity/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>info@qdrant.tech (Andrey Vasnetsov)</author><guid>https://deploy-preview-2342--condescending-goldwasser-91acf0.netlify.app/documentation/migration-guidance/data-integrity/</guid><description>&lt;h1 id="data-integrity-verification"&gt;Data Integrity Verification&lt;/h1&gt;
&lt;p&gt;Once you&amp;rsquo;ve established a &lt;a href="https://deploy-preview-2342--condescending-goldwasser-91acf0.netlify.app/documentation/migration-guidance/pre-migration-baseline/"&gt;baseline&lt;/a&gt;, you first need to check data integrity. Data integrity answers the question: &amp;ldquo;Did all my data arrive, and did it arrive correctly?&amp;rdquo; These are the fastest checks to run and catch the most common migration failures.&lt;/p&gt;
&lt;h2 id="1-vector-count-verification"&gt;1. Vector Count Verification&lt;/h2&gt;
&lt;p&gt;The simplest check: does the number of vectors in Qdrant match your source system?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;qdrant_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QdrantClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QdrantClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6333&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Get collection info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;collection_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;your_collection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;qdrant_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collection_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;points_count&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Compare against baseline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;source_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;total_vector_count&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# From pre-migration capture&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;qdrant_count&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;source_count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;✓ Vector count matches: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;qdrant_count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;source_count&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;qdrant_count&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;source_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;✗ Count mismatch: source=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;source_count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, qdrant=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;qdrant_count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;missing=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pct&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Common causes of count mismatches:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Search Quality</title><link>https://deploy-preview-2342--condescending-goldwasser-91acf0.netlify.app/documentation/migration-guidance/search-quality/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>info@qdrant.tech (Andrey Vasnetsov)</author><guid>https://deploy-preview-2342--condescending-goldwasser-91acf0.netlify.app/documentation/migration-guidance/search-quality/</guid><description>&lt;h1 id="search-quality-verification"&gt;Search Quality Verification&lt;/h1&gt;
&lt;p&gt;Two systems can hold identical vectors and produce different search results because of differences in indexing, quantization, scoring, and filtering implementation.&lt;/p&gt;
&lt;p&gt;This is perhaps the hardest part of migration verification. The guide breaks it into &lt;strong&gt;three tiers&lt;/strong&gt; so you can pick the level of rigor that matches your resources and risk tolerance.&lt;/p&gt;
&lt;h2 id="three-tiered-search-quality-checks"&gt;Three-Tiered Search Quality Checks&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tier&lt;/th&gt;
 &lt;th&gt;Effort&lt;/th&gt;
 &lt;th&gt;What It Catches&lt;/th&gt;
 &lt;th&gt;When to Use&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Tier 1: Spot-Check&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;15 min&lt;/td&gt;
 &lt;td&gt;Gross failures: wrong metric, broken filters, obviously wrong results&lt;/td&gt;
 &lt;td&gt;Every migration&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Tier 2: Statistical Sampling&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;1-2 hours&lt;/td&gt;
 &lt;td&gt;Systematic recall degradation, filter interaction bugs, score distribution shifts&lt;/td&gt;
 &lt;td&gt;Production workloads, &amp;gt;100K vectors&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Tier 3: Gold-Standard Evaluation&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Half day to days&lt;/td&gt;
 &lt;td&gt;Measurable relevance changes with confidence intervals&lt;/td&gt;
 &lt;td&gt;High-stakes search (revenue, safety), regulated industries&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Our recommendation:&lt;/strong&gt; Every migration should run Tier 1 and Tier 2. Tier 3 is for teams that have (or can build) labeled evaluation data. If you don&amp;rsquo;t have labeled data today, Tier 2 gives you a strong quantitative baseline and this guide shows you how to build toward Tier 3 over time.&lt;/p&gt;</description></item><item><title>Diagnosing Discrepancies</title><link>https://deploy-preview-2342--condescending-goldwasser-91acf0.netlify.app/documentation/migration-guidance/diagnosing-discrepancies/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>info@qdrant.tech (Andrey Vasnetsov)</author><guid>https://deploy-preview-2342--condescending-goldwasser-91acf0.netlify.app/documentation/migration-guidance/diagnosing-discrepancies/</guid><description>&lt;h1 id="diagnosing-discrepancies"&gt;Diagnosing Discrepancies&lt;/h1&gt;
&lt;p&gt;When verification catches a problem, you need to determine whether it&amp;rsquo;s a data issue (something went wrong during migration) or a configuration issue (the data is correct but the systems behave differently). This page provides a diagnostic decision tree and vendor-specific gotchas.&lt;/p&gt;
&lt;h2 id="decision-tree"&gt;Decision Tree&lt;/h2&gt;
&lt;p&gt;Start here when any verification check fails:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Is the vector count wrong?
├─ Yes → Data-level issue
│ ├─ Count lower than expected → Check migration script logs for errors,
│ │ timeouts, or partial failures. Re-run for missing segments.
│ ├─ Count higher than expected → Check for duplicate inserts (retried batches)
│ │ or source count excluding namespaces/partitions.
│ └─ Count matches but IDs differ → ID mapping error during migration.
│
└─ No (count matches) → Continue
 │
 Are metadata fields missing or wrong type?
 ├─ Yes → Payload mapping issue
 │ ├─ Fields missing → Source system may omit null fields on export.
 │ │ Check migration script&amp;#39;s null handling.
 │ ├─ Types changed → See &amp;#34;Type Coercion&amp;#34; section below.
 │ └─ Values differ → Encoding issue (UTF-8, special characters, unicode normalization).
 │
 └─ No (metadata looks correct) → Continue
 │
 Are search results completely different?
 ├─ Yes → Configuration-level issue
 │ ├─ Check distance metric (most common cause)
 │ ├─ Check if index is built (HNSW may not be built yet on fresh data)
 │ └─ Check if vectors are normalized (affects cosine vs. dot product)
 │
 └─ No (results overlap but differ at the margins) → Expected behavior
 │
 Is recall@10 below 0.85?
 ├─ Yes → Indexing parameter mismatch
 │ ├─ Compare HNSW ef_construction and M values
 │ ├─ Compare ef (search-time) parameters
 │ └─ Check quantization settings
 │
 └─ No → Migration is working correctly.
 Results differ on borderline cases due to
 ANN approximation. This is normal.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration-level-issues"&gt;Configuration-Level Issues&lt;/h2&gt;
&lt;h3 id="distance-metric-mismatch"&gt;Distance Metric Mismatch&lt;/h3&gt;
&lt;p&gt;The most impactful configuration error. Here&amp;rsquo;s how metrics map across systems:&lt;/p&gt;</description></item></channel></rss>