migrate2vespa
A workload-aware schema migration planner for Vespa, currently supporting Elasticsearch and OpenSearch.
Don't translate field types. Infer field requirements.
Reads local source artifacts, accounts for every supplied field, document and representative query, and writes a reviewable migration manifest. When safe, it also generates a Vespa application package with PyVespa.
Source-specific interpretation is isolated from the migration manifest, Vespa planner and package generator. Additional source engines can therefore be added without duplicating the Vespa planning pipeline.
Offline and deterministic. No cluster connections, no LLM, no behavioral-parity claim. Built by Searchplex.
Quickstart
Requires Python 3.11–3.13.
python3 -m pip install migrate2vespa
migrate2vespa ./es-app
Results go to ./es-app/out/ by default. Try the fixture:
git clone https://github.com/searchplexai/migrate2vespa.git
cd migrate2vespa
python3 -m pip install -e .
migrate2vespa fixtures/quickstart
Next step printed on success: vespa deploy --wait 600 out/vespa-app.
Input
es-app/
├── mapping.json # required
├── settings.json # optional analysis settings
├── documents.jsonl # optional representative documents
└── queries/ # optional _search request bodies
Canonical names preferred; a single unambiguous *mapping*.json /
*setting*.json is accepted. Documents may use _id/_source or an id
field. Queries supply usage evidence; they are not compiled to YQL. One source
index per run. migrate2vespa ./mapping.json is mapping-only.
Output
es-app/out/
├── migration-manifest.yaml
└── vespa-app/ # absent when generation is blocked or skipped
├── services.xml
├── schemas/<schema>.sd
└── feed/documents.jsonl
The manifest records source semantics, evidence, capabilities, proposed Vespa
fields, decisions, risks and rule IDs, plus a coverage ledger. Generation is
READY, PARTIAL (omissions recorded; containers omitted with their children),
or BLOCKED. See docs/overview.md.
Recognized surface
| Surface | Behavior |
|---|---|
| Fields | text, keyword, boolean, integer, long, float, double, recognized date, dimensioned float dense_vector |
| Adaptations | Multi-fields, observed arrays, lowercase normalizers, dates → epoch seconds, vectors → tensors |
| Query evidence | match, match_phrase, term, terms, range, sort, basic aggregations, knn; custom scoring → redesign |
Unrecognized constructs are recorded, not guessed.
CLI
migrate2vespa ./es-app --analyze-only
migrate2vespa ./es-app --output ./migration-work
migrate2vespa generate ./es-app/out/migration-manifest.yaml
Exit codes: 0 success, 2 invalid input, 3 blocked generation, 1 other
failure. Status vocabulary: READY, READY WITH CAVEATS, DECISION REQUIRED,
REDESIGN REQUIRED.
Trust boundary
Reads only paths you supply. Writes under the chosen output directory. No credentials, telemetry or network clients at runtime. Review and validate the generated package before production use — SECURITY.md.
Development
python3 -m pip install -e '.[dev]'
python3 -m pytest -q
scripts/validate-with-vespa-docker.sh # needs Docker + Vespa CLI
See CONTRIBUTING.md.
Copyright © 2026 Searchplex. Licensed under the Apache License 2.0.
Release files for migrate2vespa 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| migrate2vespa-0.1.0.tar.gz | 68.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| migrate2vespa-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 129.8 kB
Release files / migrate2vespa-0.1.0.tar.gz
| Download URL | migrate2vespa-0.1.0.tar.gz |
|---|---|
| Size | 68.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2f1b0e46bf6e401765628979b412c842fba793c855ea2de241cf4e0d6efb72fe
|
|
BLAKE2b-256 checksum How to use checksums |
115ba73b870c6adb20688b6636bc209ed28b660a8a1c80205e67c878f729bcaa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / migrate2vespa-0.1.0-py3-none-any.whl
| Download URL | migrate2vespa-0.1.0-py3-none-any.whl |
|---|---|
| Size | 61.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7b8802ecdad385cf7581451e68f75d9538fe7fa2c35731de264991432d5cce2e
|
|
BLAKE2b-256 checksum How to use checksums |
0daf9521d10fa83d40d49f9e2e0884324b1100667d5d5bdc06040547e8ab8e5a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency log