all posts

The best Meilisearch hosting platforms in 2026

Ajay Kumar··10 min read

Search is the feature users notice only when it is bad. Nobody finishes a session thinking about how pleasant your autocomplete was. They do remember typing a product name with one letter wrong and getting nothing back, and they remember it in a way that shows up in your conversion numbers rather than your bug tracker.

Meilisearch exists for people who looked at Elasticsearch, priced out the JVM heap and the cluster and the index lifecycle policies, and concluded that what they wanted was typo-tolerant search-as-you-type over a few million documents. That is more often correct than the search-infrastructure industry would like you to believe. Meilisearch is a single Rust binary with a memory-mapped LMDB store on a local disk, good defaults, and a REST API you can learn in an afternoon.

I build PandaStack, so, up front: we do not sell managed Meilisearch. We run managed PostgreSQL 16 and host apps and workers on Firecracker microVMs. This is a roundup where the honest answer for many readers is a product I do not sell, and there is a section below where our best feature is the wrong tool. Pricing, tiers and HA features here move fast; verify anything that matters against current vendor docs.

What Meilisearch is good at, and where it stops

Meilisearch is optimised for one shape of problem: someone typing into a box, expecting results before they finish the word. Prefix matching is on by default rather than something you build an ngram analyser for. Typo tolerance is built in and scales with word length, so a three-letter word tolerates nothing and a nine-letter word tolerates two. Ranking is an ordered, editable list of rules — words, typo, proximity, attribute, sort, exactness — so when a result ranks wrong you read the list and reason about why, instead of reverse-engineering a similarity score. Around that sit the pieces that make a search box feel like a product: filterable attributes, faceting for the counts-per-category sidebar, sortable attributes to break ties by price or recency, multi-search so one request populates a grouped dropdown, and synonyms as configuration rather than a pipeline.

Where it stops is less advertised. There is no aggregation pipeline — no date histograms feeding a dashboard, no nested bucket maths. It is not a log store: point your application logs at it and you will find the retention and rollover machinery of a real observability system is simply not there. Not an analytics engine, not a source of truth. It is a search index over data that lives somewhere else, and the somewhere else is your database.

The clean mental model: Meilisearch is a derived read model. Your database row is the truth, the index is a projection of it optimised for one access pattern, and you should be able to throw it away and rebuild. If you cannot say out loud how long a full rebuild takes, you do not have a recovery plan.

The single-node reality, and your uptime plan

Elasticsearch was a distributed system from the first commit: shards, replicas, cluster coordination, lose a node and keep serving. That is the thing you were escaping, and escaping it costs something. Meilisearch's clustering and high-availability story is different in kind, not just degree, and it has moved across releases in ways that make any specific claim here go stale. Check current docs for what replication exists in your version, and whether it is an engine feature or a cloud-tier one — that boundary has moved too.

What you can plan around is the shape of the problem. A search index is stateful, lives on a disk, and is expensive to rebuild, so the pattern that works for stateless web servers — run three, load balance, let one die — does not transfer for free. Two honest options, one dishonest.

  • Accept single-node and plan for the outage. One instance, a tested rebuild path, and search treated as a degraded experience rather than a page — your application falls back to a plain database query: worse results, still results. A respectable choice, and quietly a common one.
  • Run multiple independent instances fed by one indexer. Instead of clustering, your sync layer writes to two or more and reads are balanced across them. They drift briefly, which for a search index is usually fine, and any one can be rebuilt from source. More work than a cluster, considerably less mystery.
  • The dishonest option is one instance, called production, never restore-tested, described as highly available because it sits behind a load balancer. The search index nobody has a restore procedure for is a common object. It is fine right up until the disk it lives on is not.

Either way, your uptime plan for search should be a rebuild plan, not a failover plan. That is a different discipline, and a cheaper one.

RAM, LMDB, and the page cache you are buying

Meilisearch stores its index in LMDB, which is memory-mapped: the file is mapped into the process address space and the kernel's page cache decides what stays resident. This catches people out in both directions. Resident set size on a memory-mapped process is not a straightforward measure of need — a machine that looks alarmingly full may be doing exactly its job. Teams see the number, panic, and buy a bigger machine that changes nothing.

The direction that hurts is the other one. If your hot working set does not fit in page cache, queries fault to disk and latency stops being a tight distribution and becomes a lottery — p50 still looks healthy while p99 goes somewhere embarrassing, which is exactly the failure that makes a search box feel broken without raising your error rate. Indexing makes it worse temporarily, being far more memory- and IO-hungry than serving. So measure the on-disk index after a full build, provision RAM so the frequently-touched part fits with headroom for indexing bursts, and shrink the index before you buy memory: only what you search is searchable, only what you filter on is filterable, and stop storing document bodies you never display.

Three ops traps worth knowing first

The master key model is easy to get wrong

Meilisearch starts with a master key, from which admin and search keys are derived. It can do anything, including deleting every index you have, and it should never be near a browser. Keep it in the server environment, use an admin key for your backend indexer, and give clients a search-only or tenant-scoped token. Put an admin key in a frontend bundle because it was quicker and you have shipped a public write endpoint into your search index. The internet contains people who scan for exactly that.

Upgrades can mean a dump and restore

The on-disk format has changed between versions, and historically crossing an incompatible boundary meant dumping on the old version and importing on the new one, not pointing the new binary at the old data directory. Details differ by version, so read the release notes for your jump. The planning consequence: an upgrade is not always a package bump and a restart, it can be a maintenance window proportional to index size. Rehearse it somewhere that is not production.

Reindexing from source is your real backup

Dumps and snapshots exist and are useful, but for a derived read model the durable copy is the database it came from, and the recovery that always works is running the indexer again. Lean into that and it simplifies: your backup is a script you already maintain, testable weekly against a scratch index, and you never have to decide whether an old dump agrees with your primary database. The condition is a rebuild fast enough that you would run it under pressure. If a full reindex takes six hours, your search recovery objective is six hours — a problem to solve now rather than at 3am.

What self-hosting actually looks like

Worth showing, because the entire argument for Meilisearch is that this is short.

#!/usr/bin/env bash
set -euo pipefail

# 1. Install the binary. One file, no runtime, no JVM heap to tune.
curl -L https://install.meilisearch.com | sh
sudo install -m 0755 ./meilisearch /usr/local/bin/meilisearch

# 2. Dedicated user + a data directory on the volume you actually back up
#    (or, per the argument above, the one you can afford to rebuild).
sudo useradd --system --no-create-home --shell /usr/sbin/nologin meilisearch || true
sudo mkdir -p /var/lib/meilisearch/data
sudo chown -R meilisearch:meilisearch /var/lib/meilisearch

# 3. Generate a master key and keep it OUT of your app config. Derive an
#    admin key for the indexer and a search-only key for clients.
sudo install -m 0600 /dev/null /etc/meilisearch.env
printf 'MEILI_MASTER_KEY=%s\n' "$(openssl rand -hex 32)" | sudo tee -a /etc/meilisearch.env >/dev/null
cat <<'EOF' | sudo tee -a /etc/meilisearch.env >/dev/null
MEILI_ENV=production
MEILI_DB_PATH=/var/lib/meilisearch/data
# Bind to loopback and reach it over a private network or a proxy. A search
# engine on 0.0.0.0 with a guessable key is a public write endpoint.
MEILI_HTTP_ADDR=127.0.0.1:7700
MEILI_NO_ANALYTICS=true
EOF

# 4. systemd unit. Restart=always matters: this process holds your index, and
#    an unnoticed crash looks exactly like "search is a bit broken today".
cat <<'EOF' | sudo tee /etc/systemd/system/meilisearch.service >/dev/null
[Unit]
Description=Meilisearch
After=network-online.target

[Service]
User=meilisearch
Group=meilisearch
EnvironmentFile=/etc/meilisearch.env
ExecStart=/usr/local/bin/meilisearch
Restart=always
RestartSec=2
# LMDB is memory-mapped: give it file descriptors, and do not cap RSS with a
# naive MemoryMax that fights the page cache.
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now meilisearch
curl -s http://127.0.0.1:7700/health

The six options

1. Meilisearch Cloud

The first-party managed offering: provisioning, backups, monitoring, support from people who can read the source, and upgrades handled for you — which, given the dump-and-restore point above, is a bigger benefit than it first appears. If you have chosen Meilisearch and do not want to own a stateful service, this is the default, and avoiding it is not clever. Check in their docs rather than here which tiers offer what in replication and availability, and how plan sizes map to index size and search volume. Model pricing against your own document count and query volume, because the cheapest tier that fits today has a way of not fitting in six months.

2. Self-hosting on a VM

Everything in the script above, on a machine rented from anyone. The calculus is unusual: because Meilisearch is one binary with one data directory, self-hosting costs closer to running a Redis than an Elasticsearch cluster. What you take on is a service that must stay up, a disk that must stay attached, RAM sized against the index, the upgrade path, the key model, and a rebuild script you have tested. If that list is manageable — for many teams it is — you get full control over data residency, no per-search pricing, and a bill that is just a VM. If it reads as five things nobody currently owns, buy the managed option instead of pretending.

3. Typesense

The closest genuine alternative, and it deserves better than the tribal comparison. Typesense is also open source, also single-purpose, also aimed at instant search, also has a first-party cloud, and also does faceting, filtering and federated multi-index search. The differences are emphasis and operations. Typesense has historically been more explicit about multi-node HA as a documented, first-class arrangement, and is more in-memory by design, which makes your RAM budget a direct and less forgiving function of index size. Meilisearch tolerates an index larger than RAM at the cost of page-cache-dependent latency, and its ordered ranking rules make relevance easier to reason about. Load your corpus into both for an afternoon — relevance on your data beats any feature matrix, this one included.

4. Algolia

The hosted-SaaS end of the spectrum, and the incumbent everything else here is defined against. It is genuinely excellent: mature relevance tuning, analytics on what users search for and fail to find, the best front-end libraries in the category, and a distributed search network that gives low latency almost everywhere without you thinking about regions. The trade-offs are structural. Pricing is oriented around search volume and records rather than a machine you rent, so the bill scales with usage — fine when usage is small, a line item someone senior asks about when it is not. And your data leaves your infrastructure: a non-issue for a public catalogue, the whole conversation for anything with tenancy or compliance sensitivity.

5. Postgres tsvector and pg_trgm — the baseline you may already have

Before adding a system, check whether you need one. Postgres has two mechanisms that together cover surprising ground: tsvector full-text search with stemming and ranking, and pg_trgm trigram matching for fuzzy typo tolerance and index-accelerated LIKE. On a catalogue of tens or hundreds of thousands of rows, where search is a feature rather than the product, they do a competent job.

This is the option where I have an interest, so weigh it accordingly: managed PostgreSQL 16 is something we run. It is also the option I most often think teams should take, because it deletes a class of problem — no second system, no sync worker, no drift between a row and its projection, one internally consistent backup, and filters that are ordinary SQL predicates in the same query as the ranking.

-- The "you might not need a search engine" setup, in one migration.
CREATE EXTENSION IF NOT EXISTS pg_trgm;

ALTER TABLE products
  ADD COLUMN search_doc tsvector
  GENERATED ALWAYS AS (
    setweight(to_tsvector('english', coalesce(name, '')),        'A') ||
    setweight(to_tsvector('english', coalesce(brand, '')),       'B') ||
    setweight(to_tsvector('english', coalesce(description, '')), 'C')
  ) STORED;

CREATE INDEX products_search_doc_idx ON products USING gin (search_doc);

-- Trigram index for the typo-tolerant half. This is the bit that rescues
-- "kubernets" and stops ILIKE '%foo%' being a sequential scan.
CREATE INDEX products_name_trgm_idx ON products USING gin (name gin_trgm_ops);

-- Ranked full-text plus an ordinary predicate in one query -- exactly the
-- thing a separate search index makes awkward.
SELECT id, name,
       ts_rank(search_doc, websearch_to_tsquery('english', $1)) AS rank
FROM products
WHERE tenant_id = $2
  AND archived_at IS NULL
  AND search_doc @@ websearch_to_tsquery('english', $1)
ORDER BY rank DESC
LIMIT 20;

-- Fuzzy fallback when the strict query returns nothing. Tune the threshold
-- against your own data; 0.3 is a starting point, not a recommendation.
SELECT id, name, similarity(name, $1) AS sim
FROM products
WHERE tenant_id = $2
  AND name % $1
ORDER BY sim DESC
LIMIT 20;

Where it stops: this is not search-as-you-type. Prefix behaviour is fiddly, trigram typo tolerance is cruder than Meilisearch's word-length-aware model, faceted counts are your own GROUP BY queries, and relevance tuning is ts_rank weights rather than a readable list of rules. If the search box is a primary interaction you will feel the difference and should buy the specialist. If it is a filter box above an admin table, you were about to add a second system to avoid forty lines of SQL.

6. PandaStack

Direct, since it is my company: we do not offer managed Meilisearch. Nothing here competes with Meilisearch Cloud or Algolia on running the engine for you. If that is what you came for, one of the five options above is your answer.

What we offer is adjacent, and it is two things. Managed PostgreSQL 16 — the option-five baseline above — provisioned in thirty to ninety seconds into its own Firecracker microVM with a durable volume, which makes us a complete answer if tsvector and pg_trgm cover your requirement. And hosting for the pieces around a search index: the app querying it, and the reindex worker keeping it current, as a scheduled function or a sandbox that restores from a snapshot in about 179ms at p50 and disappears when the job ends.

# The reindex worker as an ephemeral job. Boots from a snapshot, runs the
# sync, disappears -- you are not paying for an idle machine whose purpose is
# to run a script every fifteen minutes.
from pandastack import Sandbox

sbx = Sandbox.create(template="base", ttl_seconds=900)
r = sbx.exec("python sync_index.py --full")
sbx.destroy()

print(r.exit_code, r.stdout[-2000:])

# Two things this shape is good for:
#   - a full rebuild after a schema or ranking-rule change, in a VM sized for
#     the burst rather than on the box currently serving queries
#   - the nightly reconciliation that catches documents your incremental sync
#     dropped, which it will, because every incremental sync does

Now the part where our best feature is the wrong tool. PandaStack apps and sandboxes scale to zero, which we are proud of and which is genuinely great for a bursty API or a cron worker. A Meilisearch instance is close to the worst possible fit: the index must stay warm, because the whole performance argument rests on a populated page cache, and durable, because a search index on ephemeral storage is a rebuild waiting for something you did not schedule. Scaling a search engine to zero converts your fastest component into your slowest. You can still run it on a PandaStack microVM — root, a durable volume, a private network, one Rust binary — but always-on with the idle behaviour off, which means buying a VM from us rather than our best idea. I would rather say that than sell you a scale-to-zero search index that disappoints you in month two.

Side by side

  • Meilisearch Cloud — Model: first-party managed Meilisearch, upgrades and backups handled by the people who write the engine. Ops: none. Best for: you have chosen Meilisearch and do not want to own a stateful service. Verify availability features and plan sizing in current docs.
  • Self-hosted Meilisearch on a VM — Model: one binary, one data directory, one systemd unit, your disk. Ops: RAM sizing, upgrades, key hygiene, a tested rebuild script. Best for: data residency, flat predictable cost, teams who already run stateful services competently.
  • Typesense — Model: the closest alternative; open source, single-purpose, first-party cloud, more explicit multi-node HA, more in-memory by design. Ops: comparable to self-hosted Meilisearch, clustering a documented path. Best for: teams who want HA topology and knobs. Trial both on your corpus.
  • Algolia — Model: hosted SaaS, mature relevance tuning, best front-end libraries, distributed search network. Ops: none. Best for: search drives revenue and you want a vendor. Trade: usage-shaped pricing, and your data leaves your infrastructure.
  • Postgres tsvector plus pg_trgm — Model: no new system; ranked full-text and trigram fuzzy matching in the database you already run. Ops: a migration and two indexes. Best for: search as a feature, where filters and joins matter more than autocomplete polish. Stops short of search-as-you-type.
  • PandaStack — Model: not a managed search engine. Managed Postgres 16 for the baseline above, plus app hosting and ephemeral sandboxes for the service and reindex worker that talk to whichever index you pick. Ops: yours for the index, ours for the database. Best for: the surrounding pieces — our scale-to-zero is a bad fit for a warm index.
Every vendor here has reshaped pricing, tiers and availability features within recent memory, and the open-source-versus-cloud boundary has moved too. Treat the claims above as a starting point for reading their docs, not a substitute for it.

How to choose in ten minutes

  1. Write down your document count, average document size, and how often documents change. Nothing below can be answered without those three, and they take one query.
  2. Decide whether search is the product or a feature. A catalogue or docs site people browse is the product. A filter box above an admin table is a feature, and features get answered with tsvector and pg_trgm first.
  3. Decide whether your data may leave your infrastructure. That one question eliminates either Algolia or half the operational burden here, and it is faster to answer than any benchmark.
  4. Time a full reindex from your primary database. That number is your search recovery objective under every option here, managed or not; if it is unacceptable, fixing the indexer comes before choosing a host.
  5. Only then pick: a first-party cloud if you want managed, a VM if residency or flat cost dominates, Algolia if search drives revenue and its pricing model is worth the vendor relationship.

The short version

Meilisearch is one of the easier stateful services to host, and that is the point of it. Their cloud is the low-friction answer, a VM is the low-cost full-control answer, and the gap is smaller than it would be for almost any other search engine. Typesense is close enough that you should try both on your own data. Algolia buys the least operational work and charges you in usage and in where your data lives.

But check the baseline first. A meaningful share of teams shopping here would be well served by two indexes in the database they already run, and spared a sync worker, a second backup story, and an index nobody has ever restored. The measure of a good search decision is not how sophisticated the engine is. It is whether anyone ever types a word with a letter wrong and gets nothing back.

Frequently asked questions

Is Meilisearch highly available out of the box?

Not the way an Elasticsearch cluster is. Meilisearch is fundamentally a single stateful process with a memory-mapped index on a local disk, and its replication story has changed across releases and differs between the open-source engine and the cloud offering, so check current documentation for the version you plan to run. What does not change is the planning consequence: because the index is a derived read model rebuilt from your primary database, resilience should centre on a fast, tested rebuild rather than failover. Many teams run a single node, fall back to a plain database query when search is down, and treat that as degraded rather than an outage. That is defensible, provided somebody has actually timed the rebuild.

Meilisearch vs Typesense — which should I pick?

They overlap heavily: both are open-source, single-purpose, typo-tolerant search engines aimed at instant search, both offer a first-party cloud, and both handle faceting, filtering and multi-index search. The differences are emphasis. Typesense has historically been more explicit about multi-node high availability as a documented, first-class arrangement, and it is more in-memory by design, making your RAM budget a direct function of index size. Meilisearch memory-maps its LMDB index, which tolerates an index larger than RAM at the cost of latency that depends on the page cache, and its ordered ranking rules make relevance easier to reason about. Given the similarity, load your own corpus into both and judge the results. Relevance on your data beats any feature comparison.

How much RAM does Meilisearch need?

Enough that the frequently-queried portion of the index stays resident in the operating system's page cache, plus headroom for indexing bursts, which are far more memory- and IO-hungry than serving queries. Because the index is memory-mapped through LMDB, resident set size is misleading — a process that looks like it is consuming a lot of memory may simply have cached pages the kernel will happily evict. The failure that matters is the opposite one: when the working set no longer fits, queries fault to disk and p99 latency degrades badly while p50 still looks healthy. Measure on-disk index size after a full build and size from there. Trimming searchable and filterable attributes is usually cheaper than buying memory.

Can Postgres full-text search replace Meilisearch?

For many applications, yes. A tsvector column with weighted fields and a GIN index gives stemmed, ranked full-text search, and pg_trgm adds trigram matching for fuzzy typo tolerance plus index-accelerated LIKE. Together they handle tens or hundreds of thousands of rows well, and they keep search in the same transaction, backup and query as your filters and joins, which removes the sync worker and the drift that come with any second system. Where Postgres genuinely falls short is search-as-you-type: prefix behaviour is fiddly, trigram typo tolerance is cruder than Meilisearch's word-length-aware model, and faceted counts become your own aggregate queries. If the search box is a primary interaction, buy the specialist.

What is the right backup strategy for a Meilisearch index?

Reindexing from your source database, in almost every case. Meilisearch offers dumps and snapshots and they are useful for migrations and fast recovery, but a search index is a projection of data living elsewhere, so the authoritative copy is your primary database and the procedure that is always correct is running the indexer again. Leaning into that is a real simplification: your backup is a script you already maintain, you can test it weekly by rebuilding into a scratch index, and you never have to reason about whether an old dump agrees with current data. The condition is that the rebuild must be fast enough that you would run it during an incident. Time it and treat that number as your recovery objective.

Keep reading

Run code in a microVM in one API call.

49ms p50 cold start. Fork, snapshot, and scale to zero.

Start free
Written by Ajay Kumar, Founder, PandaStack.