Orion · 1.0.0
One lifecycle, every engine.
One framework-free core and an adapter package per engine: Elasticsearch, SolrCloud, OpenSearch and Meilisearch. Plan, apply, reindex, alias swap, replay and fusion live once in core, so every engine gets the same lifecycle; storage runs on your connection, PostgreSQL, MySQL and SQLite through PDO, or the Univeros module's.
bin/orion apply products --schema=products.yaml --bootstrap=orion.php --json bin/orion reindex products --schema=products.yaml --dry-run bin/orion outbox:drain && bin/orion verify --json Elasticsearch · 9.5 / 8.19
orion-search/elasticsearch
new ElasticsearchEngine($client) on elasticsearch/elasticsearch; strict mappings, externally versioned writes.
SolrCloud · 10 / 9.11
orion-search/solr
SolrEngine on solarium/solarium, with Orion's configset; ORION_ENGINE=solr in the module.
OpenSearch · 3.9 / 2.19
orion-search/opensearch
OpenSearchEngine::connect($url); vectors through the bundled k-NN plugin, hybrid fusion in core.
Meilisearch · 1.56 / 1.13
orion-search/meilisearch
MeilisearchEngine::connect($url, $apiKey); schema as settings, versions kept by Orion, aliases emulated by core.
Engine matrix
Engines and versions
| Engine | Tested in CI | Package | Client | Univeros module |
|---|---|---|---|---|
| Elasticsearch 8.19 and 9.x | 9.5, 8.19 | orion-search/elasticsearch | elasticsearch/elasticsearch | ORION_ELASTICSEARCH_URL |
| SolrCloud 9.x and 10.x | 10, 9.11 | orion-search/solr | solarium/solarium | ORION_SOLR_URL |
| OpenSearch 2.19 and 3.x | 3.9, 2.19 | orion-search/opensearch | opensearch-project/opensearch-php | ORION_OPENSEARCH_URL |
| Meilisearch 1.13 and later | 1.56, 1.13 | orion-search/meilisearch | meilisearch/meilisearch-php | ORION_MEILISEARCH_URL |
For Univeros users
univeros/orion is one line in
config/modules.php: Orion on the application's own Cycle
connection, the migration, the orion:* commands,
7 doctor checks, its section of the AI-readable manifest, and the drain on
the bus and the metrics on the Meter where those packages are configured. ORION_ENGINE picks the engine.
The Univeros module ·
examples/univeros
Packages
Install only what you run.
11 Composer packages on one version line, 1.0.0. Core depends on PSR interfaces only; each engine adapter carries its own client, so installing Orion never drags in an engine client you do not use.
Core
Storage and hosts
Storage on your PDO connection (PostgreSQL, MySQL, SQLite), table installer.
The search: endpoints of Orion as a PSR-15 middleware.
bin/orion: plan, apply, reindex, prune, drift, status, flush, verify, the outbox drain. YAML or deterministic JSON.
Tenancy from Polaris: the tenant is the active organization on the verified token.
The Univeros module: one line in config/modules.php; storage on the host's Cycle connection, migration, orion:* commands, doctor checks.
Engines
Engine adapter for Elasticsearch 8.19 and 9.x.
Engine adapter for SolrCloud 9.x and 10.x.
Engine adapter for OpenSearch 2.19 and 3.x.
Engine adapter for Meilisearch 1.13 and later.
How it's proven
The same lifecycle, replayed in CI.
- 4
- engines
- 8
- engine versions in CI
- 11
- packages, one version line
- 6
- proof suites
Every engine adapter extends EngineConformanceTestCase
from orion-search/testing and passes it on every line in
the matrix; the tenancy isolation, determinism, fault injection, query equivalence and endpoint fixtures suites run on every engine too (query equivalence
on Meilisearch's current line only, as its README
explains). Storage adapters pass the storage
conformance case, the same-connection proof included, on PostgreSQL, MySQL and SQLite. CI runs every
service-backed suite and fails on any skip; bin/check-imports
keeps core free of any framework and engine client.