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.

/engines/elasticsearch packages/elasticsearch

SolrCloud · 10 / 9.11

orion-search/solr

SolrEngine on solarium/solarium, with Orion's configset; ORION_ENGINE=solr in the module.

packages/solr

OpenSearch · 3.9 / 2.19

orion-search/opensearch

OpenSearchEngine::connect($url); vectors through the bundled k-NN plugin, hybrid fusion in core.

/engines/opensearch packages/opensearch

Meilisearch · 1.56 / 1.13

orion-search/meilisearch

MeilisearchEngine::connect($url, $apiKey); schema as settings, versions kept by Orion, aliases emulated by core.

/engines/meilisearch packages/meilisearch

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.

How it fits together

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.

The verification regime, in the specification