Migrate from Milvus to Qdrant

What You Need from Milvus

  • Milvus URL — the gRPC endpoint of your Milvus instance
  • Collection name — the collection to migrate
  • API key — if using Zilliz Cloud or authenticated Milvus

Concept Mapping

MilvusQdrantNotes
CollectionCollectionOne-to-one mapping
PartitionPayload field or separate collectionUse --milvus.partitions to specify which partitions to migrate
Schema fieldsPayloadNon-vector fields become payload
COSINECosineThe tool creates Cosine by default
L2EuclidNot detected. Set --qdrant.distance-metric explicitly
IP (inner product)DotNot detected. Set --qdrant.distance-metric explicitly
Dynamic fieldsPayloadJSON-typed dynamic fields are preserved

Run the Migration

docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration milvus \
    --milvus.url 'your-milvus-host:19530' \
    --milvus.collection 'your-collection' \
    --milvus.api-key 'your-milvus-api-key' \
    --qdrant.url 'https://your-instance.cloud.qdrant.io:6334' \
    --qdrant.api-key 'your-qdrant-api-key' \
    --qdrant.collection 'your-collection'

Migrating from Zilliz Cloud

Zilliz Cloud endpoints use HTTPS, so pass the full URL and enable TLS authentication:

docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration milvus \
    --milvus.url 'https://your-cluster.cloud.zilliz.com' \
    --milvus.enable-tls-auth \
    --milvus.collection 'your-collection' \
    --milvus.api-key 'your-zilliz-api-key' \
    --qdrant.url 'https://your-instance.cloud.qdrant.io:6334' \
    --qdrant.api-key 'your-qdrant-api-key' \
    --qdrant.collection 'your-collection'

Migrating Specific Partitions

docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration milvus \
    --milvus.url 'your-milvus-host:19530' \
    --milvus.collection 'your-collection' \
    --milvus.partitions 'partition_a,partition_b' \
    --qdrant.url 'https://your-instance.cloud.qdrant.io:6334' \
    --qdrant.api-key 'your-qdrant-api-key' \
    --qdrant.collection 'your-collection'

All Milvus-Specific Flags

FlagRequiredDescription
--milvus.urlYesMilvus gRPC endpoint
--milvus.collectionYesCollection name to migrate
--milvus.api-keyNoAPI key (for Zilliz Cloud)
--milvus.usernameNoUsername for authentication
--milvus.passwordNoPassword for authentication
--milvus.db-nameNoDatabase name
--milvus.partitionsNoComma-separated partition names
--milvus.server-versionNoOverride detected server version
--milvus.enable-tls-authNoEnable TLS authentication

Qdrant-Side Options

FlagDefaultDescription
--qdrant.distance-metriccosineDistance metric per vector field (map format, e.g., field1:euclid,field2:dot). The tool does not read the metric from Milvus, so set it for every L2 or IP field

Gotchas

  • Partition handling: Milvus partitions can map to Qdrant collections or payload filters. If you merge partitions into a single collection, add a partition name as a payload field for filtering.
  • Vector types: The tool creates a Qdrant vector for each dense float vector field. Check that sparse, binary, and float16 vector fields in your Milvus schema made it across, and recreate any that did not.
  • Schema strictness: Milvus enforces schema on write; Qdrant is schema-flexible. Verify that the schema-less flexibility didn’t cause payload fields to drift during migration.
  • Dynamic fields: Milvus dynamic fields (introduced in 2.3) may serialize differently. Check that JSON-typed dynamic fields survived the migration with correct structure.

Next Steps

After migration, verify your data arrived correctly with the Migration Verification Guide.

Was this page useful?

Thank you for your feedback! 🙏

We are sorry to hear that. 😔 You can edit this page on GitHub, or create a GitHub issue.