Meilisearch from evaluation to production
Why I finally wrote this down
Discovery spanned two upstream systems. Craft owned editorial content. Magento owned commerce SKUs and category shape. Frontend teams wanted one query API, facets that felt the same across both, and a security story that did not put customer or order data into the index.
The evaluation started as a shortlist: OpenSearch, Elastic, Typesense, and Meilisearch. The deciding criteria were not marketing pages. They were whether security would approve the binary, whether we could host it beside Craft on a private network, and whether one team could operate indexes without a dedicated search SRE.
What we scored before committing
License and community: open source with an active release cadence. MIT-style licensing made legal review shorter than a commercial Elastic path.
Security boundary: application audit of the GitHub project, plus a hosting plan that kept the service reachable only from our subnet. Telemetry off via
MEILI_NO_ANALYTICS=true.Data scope: product and article JSON only. No customers, orders, or invoices in the index.
Operator surface: OpenAPI REST, dumps, facets, and a path to a small internal manager UI for keys and settings.
Fit vs overkill: Elastic and OpenSearch could do far more than we needed. That horsepower would have become a knowledge silo we did not staff for.
Typesense was close. Meilisearch edged it on docs, Vue-friendly integrations, and a feature set that matched what we actually planned to ship: full-text, filters, and index dumps we could rebuild from source.
What shipped
Pipelines pushed projected documents from Magento and Craft into dedicated indexes. The frontend talked to one query surface. A small Meili-Manager style tool handled exploration, key rotation, and index settings so teammates did not need SSH for routine work.
Incident discipline mattered more than the initial ranking rules. Sync lag and bad documents look like "search is broken" from the outside. We treated outages as data problems first: is the source pipeline healthy, did deletes land, did the document shape drift?
The lesson that actually decided it
Open source and self-hosting were table stakes. What decided Meilisearch was the combination of a private hosting boundary, a document set limited to product and article projections, and an ops path a small team could own.
Search failed later on document contracts, not tokenizer tuning. Define the canonical record per source. Version it. Test deletes as hard as inserts. When the projection drifts from Craft or Magento, rebuild from source instead of patching documents by hand.
Failure modes I keep debugging
Index includes fields the UI never shows: private or internal fields still leak through the search API.
Two upstream shapes without a projection contract: Craft and Magento fields collide under the same attribute name.
Insert-only sync tests: orphans accumulate until subscribers cannot find what just unpublished.
Treating relevance as the first problem: ranking debates hide a broken document shape.
Quick review before merge
Does this index hold only product and article projections?
Are search-only keys used in browsers, and master keys kept server-side?
Can we rebuild the index from source without manual document surgery?
Do delete and unpublish paths have the same coverage as create and update?