Read one level up: https://search.qdrant.tech/md/documentation/migrate-to-qdrant

> Explore Qdrant's agent skills catalog at https://skills.qdrant.tech/
> Search the documentation at https://skills.qdrant.tech/search?query=your+query+here
> Use this file for an index of the main pages: https://qdrant.tech/llms.txt


# Migrate from Elasticsearch to Qdrant

## What You Need from Elasticsearch

- **Elasticsearch URL** — the HTTP endpoint
- **Index name** — the index containing your vectors
- **Credentials** — username/password or API key

## Concept Mapping

| Elasticsearch | Qdrant | Notes |
| :--- | :--- | :--- |
| Index | Collection | One-to-one mapping |
| Document | Point | Each document becomes a point |
| `dense_vector` field | Vector | Mapped automatically |
| Document fields | Payload | Non-vector fields become payload |
| `cosine` | `Cosine` | ES returns `1 - cosine_distance`; Qdrant returns cosine similarity directly |
| `l2_norm` | `Euclid` | Direct mapping |
| `dot_product` | `Dot` | Direct mapping |

## Run the Migration

```bash
docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration elasticsearch \
    --elasticsearch.url 'https://your-es-host:9200' \
    --elasticsearch.index 'your-index' \
    --elasticsearch.username 'elastic' \
    --elasticsearch.password 'your-password' \
    --qdrant.url 'https://your-instance.cloud.qdrant.io:6334' \
    --qdrant.api-key 'your-qdrant-api-key' \
    --qdrant.collection 'your-collection'
```

### Using API Key Authentication

```bash
docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration elasticsearch \
    --elasticsearch.url 'https://your-es-host:9200' \
    --elasticsearch.index 'your-index' \
    --elasticsearch.api-key 'your-es-api-key' \
    --qdrant.url 'https://your-instance.cloud.qdrant.io:6334' \
    --qdrant.api-key 'your-qdrant-api-key' \
    --qdrant.collection 'your-collection'
```

### All Elasticsearch-Specific Flags

| Flag | Required | Description |
| :--- | :--- | :--- |
| `--elasticsearch.url` | Yes | Elasticsearch HTTP endpoint |
| `--elasticsearch.index` | Yes | Index to migrate |
| `--elasticsearch.username` | No | Username for basic auth |
| `--elasticsearch.password` | No | Password for basic auth |
| `--elasticsearch.api-key` | No | API key for authentication |
| `--elasticsearch.insecure-skip-verify` | No | Skip TLS certificate verification |

### Qdrant-Side Options

| Flag | Default | Description |
| :--- | :--- | :--- |
| `--qdrant.id-field` | `__id__` | Payload field name for original Elasticsearch document IDs |

## Hybrid Search Considerations

If your Elasticsearch setup uses hybrid BM25 and kNN scoring, you can reconstruct this in Qdrant with [BM25 on a full-text index](https://qdrant.tech/documentation/search/text-search/full-text-search/index.md#bm25) alongside dense vectors. The migration tool transfers the dense vectors and document fields, so you don't need to generate embeddings for BM25. Create a [full-text index with scoring enabled](https://qdrant.tech/documentation/manage-data/indexing/index.md#bm25-scoring) on the text fields you want to search.

Qdrant supports native hybrid search with [Reciprocal Rank Fusion (RRF)](https://qdrant.tech/documentation/search/hybrid-queries/index.md) to combine dense and BM25 results.

## Next Steps

After migration, verify your data arrived correctly with the [Migration Verification Guide](https://qdrant.tech/documentation/migration-guidance/index.md).