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
| Weaviate | Qdrant | Notes |
|---|---|---|
| Class | Collection | One-to-one mapping |
| Properties | Payload | Direct mapping |
cosine | Cosine | Direct mapping |
l2-squared | Euclid | Qdrant uses L2, not L2-squared; scores differ in magnitude but ranking is identical |
dot | Dot | Direct mapping |
| Cross-references | Payload fields | Store referenced IDs as payload fields and rebuild linking in your application |
| Tenants | Payload field or separate collections | Use --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
| Flag | Required | Description |
|---|---|---|
--weaviate.host | Yes | Weaviate host address |
--weaviate.scheme | No | http or https (default: http) |
--weaviate.class-name | Yes | Weaviate class to migrate |
--weaviate.auth-type | No | none, apiKey, password, client, or bearer |
--weaviate.api-key | No | API key (when auth-type is apiKey) |
--weaviate.username | No | Username (when auth-type is password) |
--weaviate.password | No | Password (when auth-type is password) |
--weaviate.tenant | No | Specific tenant to migrate |
--weaviate.scopes | No | Scopes (when auth-type is password or client) |
--weaviate.client-secret | No | Client secret (when auth-type is client) |
--weaviate.token | No | Token (when auth-type is bearer) |
--weaviate.refresh-token | No | Refresh token (when auth-type is bearer) |
--weaviate.expires-in | No | Token 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.
