Migrate from Weaviate to Qdrant

What You Need from Weaviate

  • Host URL — the Weaviate instance address
  • Class name — the class to migrate
  • Authentication — API key, username/password, or bearer token depending on your setup
  • Vector dimensions — Weaviate does not expose vector dimensions through its API, so you must know this value

Pre-Create Your Qdrant Collection

curl -X PUT 'https://your-instance.cloud.qdrant.io:6333/collections/your-collection' \
    -H 'api-key: your-qdrant-api-key' \
    -H 'Content-Type: application/json' \
    -d '{
        "vectors": {
            "size": 384,
            "distance": "Cosine"
        }
    }'

Replace 384 with your actual vector dimensions. Set the distance metric to match your Weaviate configuration.

Concept Mapping

WeaviateQdrantNotes
ClassCollectionOne-to-one mapping
PropertiesPayloadDirect mapping
cosineCosineDirect mapping
l2-squaredEuclidQdrant uses L2, not L2-squared; scores differ in magnitude but ranking is identical
dotDotDirect mapping
Cross-referencesPayload fieldsStore referenced IDs as payload fields and rebuild linking in your application
TenantsPayload field or separate collectionsUse --weaviate.tenant to migrate a specific tenant

Run the Migration

docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration weaviate \
    --weaviate.host 'your-weaviate-host.example.com' \
    --weaviate.scheme https \
    --weaviate.class-name 'YourClass' \
    --weaviate.auth-type apiKey \
    --weaviate.api-key 'your-weaviate-api-key' \
    --qdrant.url 'https://your-instance.cloud.qdrant.io:6334' \
    --qdrant.api-key 'your-qdrant-api-key' \
    --qdrant.collection 'your-collection' \
    --migration.create-collection false

All Weaviate-Specific Flags

FlagRequiredDescription
--weaviate.hostYesWeaviate host address
--weaviate.schemeNohttp or https (default: http)
--weaviate.class-nameYesWeaviate class to migrate
--weaviate.auth-typeNonone, apiKey, password, client, or bearer
--weaviate.api-keyNoAPI key (when auth-type is apiKey)
--weaviate.usernameNoUsername (when auth-type is password)
--weaviate.passwordNoPassword (when auth-type is password)
--weaviate.tenantNoSpecific tenant to migrate
--weaviate.scopesNoScopes (when auth-type is password or client)
--weaviate.client-secretNoClient secret (when auth-type is client)
--weaviate.tokenNoToken (when auth-type is bearer)
--weaviate.refresh-tokenNoRefresh token (when auth-type is bearer)
--weaviate.expires-inNoToken expiry in seconds (when auth-type is bearer)

Gotchas

  • Vector dimensions not exposed: Always pre-create the Qdrant collection. If you don’t know your dimensions, check a sample vector from Weaviate or your embedding model’s documentation.
  • Cross-references: Weaviate cross-references don’t have a direct equivalent in Qdrant. Store referenced IDs as payload fields and rebuild the linking in your application layer.
  • Module dependencies: If you used Weaviate vectorizer modules (e.g., text2vec-openai), ensure you exported the actual vectors, not just the source text.

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.