Skip to main content

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)

Source distribution for migrate2vespa 0.1.0
File Size Uploaded
migrate2vespa-0.1.0.tar.gz 68.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for migrate2vespa 0.1.0
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page