docs: More migration sources

Signed-off-by: Anush008 <mail@anush.sh>
This commit is contained in:
Anush008
2026-03-19 01:06:17 +05:30
parent 47197bb2d8
commit 3ea537ec02
7 changed files with 397 additions and 6 deletions
@@ -25,8 +25,11 @@ docker pull registry.cloud.qdrant.io/library/qdrant-migration
| [pgvector](/documentation/migrate-to-qdrant/from-pgvector/) | `pg` | Yes |
| [S3 Vectors](/documentation/migrate-to-qdrant/from-s3-vectors/) | `s3` | Yes |
| [Chroma](/documentation/migrate-to-qdrant/from-chroma/) | `chroma` | Yes |
The tool also supports Redis, MongoDB, FAISS, Apache Solr, and [Qdrant-to-Qdrant](/documentation/tutorials-operations/migration/) migrations.
| [Redis](/documentation/migrate-to-qdrant/from-redis/) | `redis` | No (must pre-create) |
| [MongoDB](/documentation/migrate-to-qdrant/from-mongodb/) | `mongodb` | No (must pre-create) |
| [FAISS](/documentation/migrate-to-qdrant/from-faiss/) | `faiss` | Yes |
| [Apache Solr](/documentation/migrate-to-qdrant/from-solr/) | `solr` | No (must pre-create) |
| [Qdrant](/documentation/migrate-to-qdrant/from-qdrant/) | `qdrant` | Yes |
Not seeing your current vector store? [Open an issue on GitHub](https://github.com/qdrant/migration/issues) and let us know!
@@ -0,0 +1,65 @@
---
title: From FAISS
weight: 90
---
# Migrate from FAISS to Qdrant
## What You Need from FAISS
- **Index file path** — path to your FAISS index file
- **Distance metric** — the metric used when the index was built (`l2`, `inner product`, etc.)
<aside role="alert"><strong>Important:</strong> Only non-quantized FAISS index types are supported. Quantized indexes (e.g., <code>IndexIVFPQ</code>) do not store the original vectors and cannot be migrated.</aside>
## Supported Index Types
| FAISS Index Type | Supported | Notes |
| :--- | :--- | :--- |
| `IndexFlatL2` | Yes | Maps to `euclid` distance |
| `IndexFlatIP` | Yes | Maps to `dot` distance |
| `IndexHNSWFlat` | Yes | Full vectors are stored |
| `IndexIVFFlat` | Yes | Full vectors are stored |
| `IndexIVFPQ` | No | Quantized — original vectors not stored |
| `IndexPQ` | No | Quantized — original vectors not stored |
## Concept Mapping
| FAISS | Qdrant | Notes |
| :--- | :--- | :--- |
| Index | Collection | One-to-one mapping |
| Vector (by position) | Point | Position in index becomes point ID |
## Run the Migration
```bash
docker run --net=host --rm -it \
-v /path/to/your/index:/data \
registry.cloud.qdrant.io/library/qdrant-migration faiss \
--faiss.index-path '/data/your-index.index' \
--qdrant.url 'https://your-instance.cloud.qdrant.io:6334' \
--qdrant.api-key 'your-qdrant-api-key' \
--qdrant.collection 'your-collection' \
--qdrant.distance-metric cosine
```
### All FAISS-Specific Flags
| Flag | Required | Description |
| :--- | :--- | :--- |
| `--faiss.index-path` | Yes | Path to the FAISS index file (inside the container) |
### Qdrant-Side Options
| Flag | Default | Description |
| :--- | :--- | :--- |
| `--qdrant.distance-metric` | `cosine` | Distance metric: `cosine`, `dot`, `euclid`, or `manhattan` |
## Gotchas
- **No metadata:** FAISS indexes store only vectors. All points will have empty payloads. If you have a separate metadata store keyed by vector position, import that separately after migration.
- **Point IDs:** Points are assigned IDs based on their position in the FAISS index. Use this to join with any external metadata store.
## Next Steps
After migration, verify your data arrived correctly with the [Migration Verification Guide](/documentation/migration-verification/).
@@ -0,0 +1,76 @@
---
title: From MongoDB
weight: 80
---
# Migrate from MongoDB to Qdrant
## What You Need from MongoDB
- **Connection string** — MongoDB URI (e.g., `mongodb://user:pass@host:27017`)
- **Database name** — the database containing your collection
- **Collection name** — the collection to migrate
- **Vector field names** — the names of fields that store vector embeddings
<aside role="alert"><strong>Important:</strong> MongoDB does not expose vector dimensions or distance metrics in a way the tool can read automatically. You must create the Qdrant collection manually before running the migration.</aside>
## Concept Mapping
| MongoDB | Qdrant | Notes |
| :--- | :--- | :--- |
| Collection | Collection | One-to-one mapping |
| Document | Point | Each document becomes a point |
| Vector field | Vector | Named vectors are preserved |
| Non-vector fields | Payload | Direct mapping |
| `_id` (ObjectID or string) | Point ID + Payload | Converted to UUID; original stored in payload |
## Run the Migration
```bash
docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration mongodb \
--mongodb.url 'mongodb://localhost:27017' \
--mongodb.database 'your-database' \
--mongodb.collection 'your-collection' \
--mongodb.vector-fields 'embedding' \
--qdrant.url 'https://your-instance.cloud.qdrant.io:6334' \
--qdrant.api-key 'your-qdrant-api-key' \
--qdrant.collection 'your-collection'
```
### With Multiple Vector Fields
```bash
docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration mongodb \
--mongodb.url 'mongodb+srv://user:pass@cluster.mongodb.net' \
--mongodb.database 'your-database' \
--mongodb.collection 'your-collection' \
--mongodb.vector-fields 'title_embedding,body_embedding' \
--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 MongoDB-Specific Flags
| Flag | Required | Description |
| :--- | :--- | :--- |
| `--mongodb.url` | Yes | MongoDB connection string |
| `--mongodb.database` | Yes | Database name |
| `--mongodb.collection` | Yes | Collection name |
| `--mongodb.vector-fields` | Yes | Comma-separated list of vector field names |
### Qdrant-Side Options
| Flag | Default | Description |
| :--- | :--- | :--- |
| `--qdrant.id-field` | `__id__` | Payload field name for original MongoDB `_id` values |
## Gotchas
- **Vector field names are required:** MongoDB has no schema-level marker for vector fields. You must explicitly list them via `--mongodb.vector-fields`.
- **ID mapping:** MongoDB `_id` values (ObjectID or string) are converted to Qdrant UUIDs. The original value is stored in payload under `--qdrant.id-field`.
## Next Steps
After migration, verify your data arrived correctly with the [Migration Verification Guide](/documentation/migration-verification/).
@@ -0,0 +1,99 @@
---
title: From Qdrant
weight: 110
---
# Migrate Between Qdrant Instances
Use the `qdrant` subcommand to copy a collection from one Qdrant instance to another — or between collections within the same instance. The tool automatically recreates the full collection schema (vector config, HNSW settings, quantization, sharding) on the target.
## What You Need
- **Source Qdrant URL** — gRPC endpoint of the source instance
- **Target Qdrant URL** — gRPC endpoint of the target instance
- **Source collection name**
- **Target collection name** (must be different from source if using the same instance)
- **API keys** — for each instance, if authentication is enabled
## Concept Mapping
| Source Qdrant | Target Qdrant | Notes |
| :--- | :--- | :--- |
| Collection | Collection | Recreated with exact schema |
| Named vectors | Named vectors | All vector types preserved |
| Sparse vectors | Sparse vectors | Direct mapping |
| Payload | Payload | Direct mapping |
| Payload indexes | Payload indexes | Recreated if `--target.ensure-payload-indexes` is `true` |
| Shard keys | Shard keys | Recreated automatically |
## Run the Migration
### Between Two Instances
```bash
docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration qdrant \
--source.url 'http://source-instance:6334' \
--source.api-key 'source-api-key' \
--source.collection 'your-collection' \
--target.url 'https://your-instance.cloud.qdrant.io:6334' \
--target.api-key 'your-qdrant-api-key' \
--target.collection 'your-collection'
```
### Within the Same Instance
```bash
docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration qdrant \
--source.url 'http://localhost:6334' \
--source.collection 'original-collection' \
--target.url 'http://localhost:6334' \
--target.collection 'new-collection'
```
### With Parallel Workers
```bash
docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration qdrant \
--source.url 'http://source-instance:6334' \
--source.api-key 'source-api-key' \
--source.collection 'your-collection' \
--target.url 'https://your-instance.cloud.qdrant.io:6334' \
--target.api-key 'your-qdrant-api-key' \
--target.collection 'your-collection' \
--migration.num-workers 4
```
### All Source Flags
| Flag | Required | Description |
| :--- | :--- | :--- |
| `--source.collection` | Yes | Source collection name |
| `--source.url` | No | Source gRPC URL (default: `http://localhost:6334`) |
| `--source.api-key` | No | API key for the source instance |
| `--source.max-message-size` | No | Maximum gRPC message size in bytes (default: `33554432` = 32 MB) |
### All Target Flags
| Flag | Required | Description |
| :--- | :--- | :--- |
| `--target.collection` | Yes | Target collection name |
| `--target.url` | No | Target gRPC URL (default: `http://localhost:6334`) |
| `--target.api-key` | No | API key for the target instance |
| `--target.ensure-payload-indexes` | No | Recreate payload indexes from source (default: `true`) |
### Parallel Worker Option
| Flag | Default | Description |
| :--- | :--- | :--- |
| `--migration.num-workers` | Number of CPU cores | Number of parallel workers for migration |
## Gotchas
- **Source and target must differ:** You cannot migrate a collection to itself.
- **Parallel workers and resume:** Migration progress is tracked per worker. If you change `--migration.num-workers` between runs, the saved offsets are invalidated and the migration restarts from scratch. Use `--migration.restart` explicitly if you intentionally want to change the worker count.
- **Large messages:** If you encounter gRPC message size errors, increase `--source.max-message-size`.
- **Existing target collection:** If the target collection already exists, the tool uses it as-is without modifying the schema.
## Next Steps
After migration, verify your data arrived correctly with the [Migration Verification Guide](/documentation/migration-verification/).
@@ -0,0 +1,77 @@
---
title: From Redis
weight: 70
---
# Migrate from Redis to Qdrant
## What You Need from Redis
- **Redis address** — host and port of your Redis instance
- **FT index name** — the RediSearch full-text index that contains your vectors
- **Authentication** — username and password, if configured
<aside role="alert"><strong>Important:</strong> Redis does not expose vector configurations (dimensions, distance metric) after an index is created. You must create the Qdrant collection manually before running the migration.</aside>
## Concept Mapping
| Redis | Qdrant | Notes |
| :--- | :--- | :--- |
| FT Index | Collection | One-to-one mapping |
| Document | Point | Each document becomes a point |
| Vector field | Vector | Named vectors are preserved |
| Hash/JSON fields | Payload | Direct mapping |
| Document key | Payload field | Stored via `--qdrant.id-field` |
## Run the Migration
```bash
docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration redis \
--redis.index 'your-ft-index' \
--redis.addr 'localhost:6379' \
--qdrant.url 'https://your-instance.cloud.qdrant.io:6334' \
--qdrant.api-key 'your-qdrant-api-key' \
--qdrant.collection 'your-collection'
```
### With Authentication
```bash
docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration redis \
--redis.index 'your-ft-index' \
--redis.addr 'your-redis-host:6379' \
--redis.username 'your-username' \
--redis.password 'your-password' \
--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 Redis-Specific Flags
| Flag | Required | Description |
| :--- | :--- | :--- |
| `--redis.index` | Yes | RediSearch FT index name |
| `--redis.addr` | No | Redis address (default: `localhost:6379`) |
| `--redis.protocol` | No | Redis protocol version (default: `2`) |
| `--redis.username` | No | Username for authentication |
| `--redis.password` | No | Password for authentication |
| `--redis.client-name` | No | Client name |
| `--redis.db` | No | Database number |
| `--redis.network` | No | Network type: `tcp` or `unix` (default: `tcp`) |
### Qdrant-Side Options
| Flag | Default | Description |
| :--- | :--- | :--- |
| `--qdrant.id-field` | `__id__` | Payload field name for original Redis document keys |
## Gotchas
- **Named vectors:** If your Redis index has multiple vector fields, all are migrated as named vectors. Ensure your pre-created Qdrant collection has a matching named vector configuration.
- **ID mapping:** Redis document keys are converted to Qdrant point IDs. The original key is stored in the payload under `--qdrant.id-field`.
## Next Steps
After migration, verify your data arrived correctly with the [Migration Verification Guide](/documentation/migration-verification/).
@@ -0,0 +1,74 @@
---
title: From Apache Solr
weight: 100
---
# Migrate from Apache Solr to Qdrant
## What You Need from Solr
- **Solr URL** — the base URL of your Solr instance (e.g., `http://localhost:8983`)
- **Collection name** — the Solr collection to migrate
- **Authentication** — username and password, if configured
<aside role="alert"><strong>Important:</strong> Solr does not reliably expose vector dimensions and distance metrics via its schema API. You must create the Qdrant collection manually before running the migration.</aside>
## Concept Mapping
| Solr | Qdrant | Notes |
| :--- | :--- | :--- |
| Collection | Collection | One-to-one mapping |
| Document | Point | Each document becomes a point |
| Dense vector field | Vector | Named vectors are preserved |
| Non-vector fields | Payload | Direct mapping |
| Document ID (`id` field) | Payload field | Stored via `--qdrant.id-field` |
## Run the Migration
```bash
docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration solr \
--solr.url 'http://localhost:8983' \
--solr.collection 'your-collection' \
--qdrant.url 'https://your-instance.cloud.qdrant.io:6334' \
--qdrant.api-key 'your-qdrant-api-key' \
--qdrant.collection 'your-collection'
```
### With Authentication
```bash
docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration solr \
--solr.url 'https://your-solr-host:8983' \
--solr.collection 'your-collection' \
--solr.username 'your-username' \
--solr.password 'your-password' \
--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 Solr-Specific Flags
| Flag | Required | Description |
| :--- | :--- | :--- |
| `--solr.url` | Yes | Solr base URL (e.g., `http://localhost:8983`) |
| `--solr.collection` | Yes | Solr collection name |
| `--solr.username` | No | Username for basic authentication |
| `--solr.password` | No | Password for basic authentication |
| `--solr.insecure-skip-verify` | No | Skip TLS certificate verification (default: `false`) |
### Qdrant-Side Options
| Flag | Default | Description |
| :--- | :--- | :--- |
| `--qdrant.id-field` | `__id__` | Payload field name for original Solr document IDs |
## Gotchas
- **Named vectors:** If your Solr schema has multiple dense vector fields, all are migrated as named vectors. Ensure your pre-created collection has matching named vector configurations.
- **ID mapping:** Solr document IDs (strings) are converted to Qdrant UUIDs. The original Solr ID is stored in payload under `--qdrant.id-field`.
## Next Steps
After migration, verify your data arrived correctly with the [Migration Verification Guide](/documentation/migration-verification/).
@@ -53,12 +53,9 @@ docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration
--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
--qdrant.collection 'your-collection'
```
<aside role="status">Note the <code>--migration.create-collection false</code> flag — since you pre-created the collection, the tool should skip auto-creation.</aside>
### All Weaviate-Specific Flags
| Flag | Required | Description |