Meilisearch → Typesense Cloud
Typesense Cloud needs a typed collection before the first document. Meilisearch does not. Define the schema, import from the database that feeds search, and shadow queries before you turn Meilisearch off.
Should you make this move?
Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.
Meilisearch
- Open-source typo-tolerant search with a small API and an optional managed cloud
- Managed indexing, relevance, filtering, and globally available query APIs reduce search operations
- Primary keys, ranking rules, and heavy update workloads need explicit setup that a hosted index used to hide
- Ranking behavior, analyzers, schemas, and learned signals require careful revalidation after migration
Typesense Cloud
- A simple developer-friendly search API offers fast typo-tolerant retrieval with managed operations
- Managed indexing, relevance, filtering, and globally available query APIs reduce search operations
- Its ecosystem, analytics, merchandising, and advanced relevance controls are narrower than larger platforms
- Ranking behavior, analyzers, schemas, and learned signals require careful revalidation after migration
Typesense Cloud: A simple developer-friendly search API offers fast typo-tolerant retrieval with managed operations. This removes a major source-side concern: Primary keys, ranking rules, and heavy update workloads need explicit setup that a hosted index used to hide.
What you lose: Open-source typo-tolerant search with a small API and an optional managed cloud. What you inherit: Its ecosystem, analytics, merchandising, and advanced relevance controls are narrower than larger platforms.
Jump to a section
Know the shape of the move.
This timeline assumes
- The destination is Typesense Cloud or a Typesense cluster using the same collection API. 3DSEARCH self-hosted Typesense. Their numbers describe that install, not a Cloud invoice.
- The site already documents Algolia → Typesense Cloud and Meilisearch → Elastic Cloud.
- Your database, not the Meilisearch index, is the source of truth for a full rebuild. 3DSEARCH imported from MariaDB.
- You can name every field's type before the first import. Typesense will not infer a schema the way Meilisearch did.
- Meilisearch stays up until a week of shadowed queries is signed off.
What survives the move.
“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.
| Item | Outcome | Impact | What happens | Mitigation |
|---|---|---|---|---|
| Schema | manual | critical | 3DSEARCH wrote that Meilisearch was schema-less for their catalog and Typesense required a collection schema. They mapped name, designer, source, category, tags, likes, downloads, makes, and published date to typed fields. | Write the collection schema from the fields you filter and sort on. Create the collection before import. |
| Document id | partial | critical | Meilisearch document ids are integers or strings of letters, digits, hyphens, and underscores. Typesense uses its own id field. A Meilisearch export is not a Typesense JSONL file until you rename and type the fields. | Map the Meilisearch primary key to the Typesense id and reject empty ids. |
| Where rows come from | manual | critical | 3DSEARCH did not dump Meilisearch. A PHP script read MariaDB and posted batches of 1,000 documents. The full 4.8 million model import finished in under 40 minutes. | Import from the system of record. Use a Meilisearch dump only when that index is the only copy. |
| Sorting workarounds | partial | high | 3DSEARCH had restricted attributesToSearchOn to the name whenever a sort was active, to stop tag spam. Typesense sorting is declared on the schema instead. | List every sort the UI sends. Mark those fields sortable in the collection, and drop the workaround. |
| Synonyms and stop words | partial | medium | 3DSEARCH ported 16 English stop words and 11 synonym groups, including pla with filament and stl with 3d model, through Typesense's synonym API. | Export Meilisearch stop words and synonyms and recreate them. Do not expect the index copy to include them. |
| Ranking | partial | critical | Typesense field weights, pinning, and custom scoring are not Meilisearch rankingRules. 3DSEARCH said exact name matches started beating tag-only matches, and a search for benchy started returning the 3DBenchy model. | Compare a query list in parallel. Sign the queries where the new order is what you want. |
| Memory and latency | partial | medium | On 3DSEARCH's server, Meilisearch used up to 12 GB for 4.8 million documents and they had grown swap from 0 to 8 GB. After Typesense, average latency moved from about 20 ms to about 5–8 ms and memory dropped by roughly 40 percent. That is one self-hosted catalog. | Size the Cloud cluster from your own document count. Do not copy their RAM number onto an invoice. |
| Analytics | manual | medium | 3DSEARCH had no built-in Meilisearch analytics and built tracking themselves. Typesense Cloud analytics is a separate setup. | Turn on the analytics you still need before you judge zero-result queries. |
| API keys | manual | high | 3DSEARCH called out scoped, rate-limited keys for the site, the app API, and autocomplete, without a proxy. | Create a search-only key per client. Do not ship the admin key. |
| Geo fields | manual | medium | A Meilisearch _geo object has to become a Typesense geopoint field in the schema. You cannot add that type after the collection is full without a rebuild. | Declare geo fields in the first schema if you filter by location. |
| Parallel run | manual | high | 3DSEARCH ran both engines in a test environment for a week before switching production traffic. | Shadow the same queries. Cut over only after that week is written up. |
| Incremental sync | partial | high | Their cron pushes new and updated models every 5 minutes and usually finishes in under 10 seconds. That job is application code, not a Typesense feature that reads Meilisearch. | Repoint the sync at Typesense and watch one interval before you stop the Meilisearch writer. |
Where each thing goes.
| Source | Destination | Method | Notes |
|---|---|---|---|
| Index | Collection | manual | Create it with a schema first. |
| Primary key | Document id | transform | Required on every document. |
| Filterable attribute | Facet or filter field | transform | Type it in the schema. |
| Sort workaround | Sort field | transform | Declare it. Drop attributesToSearchOn hacks. |
| Stop word | Stop word | manual | 3DSEARCH moved 16 English stop words. |
| Synonym group | Synonym | manual | They moved 11 groups. |
| Ranking rule | Query weight or sort | manual | Re-test. Do not paste rankingRules. |
| Database row | Imported document | transform | Preferred source. Batches of 1,000 in their script. |
| Search-only client | Scoped API key | manual | One key per app surface. |
| Meilisearch task queue | Import response | manual | Check import errors per batch. |
Make the move recoverable.
Create the source-of-truth backup
Keep Meilisearch queryable and keep a schema file you can recreate the collection from.
- Export stop words, synonyms, and the current settings.
- Save document counts per index.
- Write the Typesense schema in git.
- Snapshot the database you will import from.
- Keep Meilisearch running through the shadow week.
Proof to capture: A schema file, a count per index, and a database snapshot time.
Typed collection
Give Typesense the fields you filter and sort on.
- List fields from real queries, not from every JSON key.
- Set types, facets, and sort flags.
- Create the collection before the first import.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
Batch import
Load documents from the system of record.
- Read the source database in batches.
- Map the primary key to id.
- Stop on the first batch that returns import errors.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
The things most likely to hurt.
These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.
The schema is missing a sort
The UI sorts on a field that is not in the collection.
- Consequence
- Those queries fail after cutover.
- Mitigation
- Collect sort and filter parameters from production logs first.
Stop if: A production sort is absent from the schema.
You imported the index instead of the database
Meilisearch is behind the database, and you copy the index.
- Consequence
- Typesense starts life stale.
- Mitigation
- Import from the database unless Meilisearch is the only copy.
Stop if: Document counts are lower than the source table and nobody signed the gap.
Shadow week is skipped
Traffic switches the day the import finishes.
- Consequence
- Ranking changes hit users before you have a written diff.
- Mitigation
- Run both engines for a week, as 3DSEARCH did in test.
Stop if: There is no signed query diff.
Do the work in this order.
- Days 1–3 · inventory
Fields and queries
6–12 hours active2–3 days elapsedQuery log review waiting- List filter, sort, and search fields from real queries.
- Export stop words and synonyms.
Depends on: Meilisearch admin access and a Typesense Cloud cluster
Stop / go checkpointWrite the schema?
Go when: Every production sort and filter is on the list.
Stop when: A client sends a field you cannot name.
- Days 3–5 · backup
Snapshot
3–6 hours active1–2 days elapsedDatabase snapshot waiting- Record Meilisearch counts.
- Snapshot the source database.
Depends on: Field list
Stop / go checkpointImport?
Go when: The snapshot time and the index counts are written down.
Stop when: The database you plan to read is not the one the app writes.
- Days 5–14 · pilot
Import and shadow
12–30 hours active6–10 days elapsedOne shadow week waiting- Create the collection and import batches.
- Compare queries for a week.
Depends on: Schema and snapshot
Stop / go checkpointCut over?
Go when: Counts match and the query diff is signed.
Stop when: Import errors remain in a batch.
- Days 14–18 · cutover
Repoint sync and traffic
4–10 hours active1–3 days elapsedOne sync interval waiting- Point the sync job at Typesense.
- Switch the search client after one clean interval.
Depends on: Signed shadow week
Stop / go checkpointStop Meilisearch writes?
Go when: The sync completes and production queries hit Typesense.
Stop when: The cron still writes only to Meilisearch.
- Days 17–24 · observe
Two production weeks
4–8 hours active5–8 days elapsed3DSEARCH waited two weeks before writing up results waiting- Watch latency, memory on a self-hosted cluster, and zero-result queries.
- Keep Meilisearch until that window is quiet.
Depends on: Traffic switch
Stop / go checkpointClose rollback?
Go when: No trigger fires through the observation window.
Stop when: Sync lag or ranking regressions show up.
Cut over with a way back.
Cutover
Serve search from Typesense Cloud after a shadowed week and one clean sync interval.
- Import any rows changed since the snapshot.
- Point the incremental job at Typesense and watch one run.
- Switch the search client.
- Keep Meilisearch readable.
- Compare a handful of live queries with the signed diff.
Proof to capture: Production queries hit Typesense. The sync job no longer writes to Meilisearch.
Rollback
Point the client and the sync job back at Meilisearch.
- Deploy the Meilisearch client.
- Point the cron back at Meilisearch.
- Confirm a search and an incremental update.
- Leave the Typesense collection in place for the retry.
- File the query diff that caused the rollback.
Proof to capture: Search and sync use Meilisearch again.
- Import batch errors
- A production sort is missing from the schema
- Document counts do not match the source table
- Sync interval misses its window
- An unsigned ranking change on a top query
Prove the migration worked.
Every blocking check must pass. Capture the evidence before cleanup begins.
| Pass | ID | Check | Method | Expected result | Evidence |
|---|---|---|---|---|---|
V-01Blocking | Sorts and filters | Compare production query parameters with the collection schema. | Every sort and filter field exists and has the right type. | Schema review. | |
V-02Blocking | Batch errors | Read the import response for each batch. | No document errors remain. | Import log. | |
V-03Blocking | Source table | Compare collection count with the source table and the Meilisearch index. | Gaps are signed. | Count sheet. | |
V-04Blocking | Primary key | Sample documents and compare ids. | The Typesense id matches the Meilisearch primary key. | Id sample. | |
V-05 | Stop words and synonyms | Search a synonym pair and a stop word. | The groups you ported behave as signed. | Query sample. | |
V-06Blocking | Shadow week | Review the saved query diff. | Every material change is accepted. | Diff notes. | |
V-07Blocking | One interval | Update a row and wait for the cron. | The Typesense document changes and Meilisearch is no longer required for that write. | Sync log. | |
V-08Blocking | Scoped key | Call search with the client key and try an import with it. | Search works. Import is rejected. | Key test. |
Remove the scaffolding safely.
Safe after: The observation window, with Meilisearch still restorable.
- Commit the collection schema.
- Archive the query diff and import logs.
- Rotate the Meilisearch admin key.
- Keep the Meilisearch data directory until rollback closes.
- Remove the old search client from the deploy.
- Review Cloud capacity after real traffic, the way 3DSEARCH reviewed RAM after launch.
When the plan met reality.
First-hand accounts are preferred. Vendor case studies are labeled, and every note below is an editorial paraphrase—follow the link for the full context.
Hutzi3d writes that 3DSEARCH used Meilisearch for more than a year after MariaDB full text, then moved a 4.8 million model catalog to self-hosted Typesense. Meilisearch had used up to 12 GB of RAM on a 32 GB server, and swap had been raised from 0 to 8 GB and had filled. They also limited attributesToSearchOn to the name while a sort was active. The import read MariaDB in batches of 1,000 and finished in under 40 minutes. It was not a Meilisearch dump. They ported 16 English stop words and 11 synonym groups, ran both engines for a week, and then saw latency move from about 20 milliseconds to about 5 to 8, with memory about 40 percent lower. A cron every five minutes usually finished in under 10 seconds. They also mention looking at Elasticsearch, OpenSearch, and Zinc. These figures describe that server, not a Typesense Cloud bill.
- Import from the database that owns the rows. Their script did not export Meilisearch.
- Run the old and new engines together before cutover. They did that for a week on a test environment.
- The post's destination is self-hosted Typesense. Do not paste their RAM numbers onto a Cloud invoice.
- The schema, stop words, and synonyms were recreated. They were not carried inside a dump.
Verify against the primary material.
Platform behavior changes. Check these sources and the review dates above before executing a production migration.
- Typesense: migrating from AlgoliaAccessed 2026-11-01
- Meilisearch: primary keyAccessed 2026-11-01
- Typesense: document import APIAccessed 2026-11-01
- 3DSEARCH: switched to TypesenseAccessed 2026-11-01