← All playbooks
Hosted search migration

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.

Typical timeline10–24 business days30–70 hours active work
Statusneeds review
Source profileMeilisearch primary key docs reviewed 2026-11-01
Destination profileTypesense Algolia migration guide reviewed 2026-11-01
Documentation date
Review window
Evidence4 sources
This route needs review.Use it as a planning baseline, then verify the dated sources and test with representative data before production.
Before you migrate

Should you make this move?

Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.

Current platform

Meilisearch

Reasons to stay
  • 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
Reasons to leave
  • 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
New platform

Typesense Cloud

What gets better
  • 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
What gets worse
  • 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
Best of the move

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.

Worst of the move

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
01At a glance

Know the shape of the move.

Transfer outcome12 features audited
Transfer outcome distributionClean transfer: 0, Partial transfer: 6, Manual rebuild: 6, Not transferred: 0.
Clean0
Partial6
Manual6
Lost0
Mapping route10 of 10 fields have a destination path

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.
02What transfers

What survives the move.

“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.

ItemOutcomeImpactWhat happensMitigation
Schemamanualcritical3DSEARCH 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 idpartialcriticalMeilisearch 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 frommanualcritical3DSEARCH 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 workaroundspartialhigh3DSEARCH 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 wordspartialmedium3DSEARCH 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.
RankingpartialcriticalTypesense 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 latencypartialmediumOn 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.
Analyticsmanualmedium3DSEARCH 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 keysmanualhigh3DSEARCH 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 fieldsmanualmediumA 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 runmanualhigh3DSEARCH 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 syncpartialhighTheir 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.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
IndexCollectionmanualCreate it with a schema first.
Primary keyDocument idtransformRequired on every document.
Filterable attributeFacet or filter fieldtransformType it in the schema.
Sort workaroundSort fieldtransformDeclare it. Drop attributesToSearchOn hacks.
Stop wordStop wordmanual3DSEARCH moved 16 English stop words.
Synonym groupSynonymmanualThey moved 11 groups.
Ranking ruleQuery weight or sortmanualRe-test. Do not paste rankingRules.
Database rowImported documenttransformPreferred source. Batches of 1,000 in their script.
Search-only clientScoped API keymanualOne key per app surface.
Meilisearch task queueImport responsemanualCheck import errors per batch.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Keep Meilisearch queryable and keep a schema file you can recreate the collection from.

  1. Export stop words, synonyms, and the current settings.
  2. Save document counts per index.
  3. Write the Typesense schema in git.
  4. Snapshot the database you will import from.
  5. Keep Meilisearch running through the shadow week.

Proof to capture: A schema file, a count per index, and a database snapshot time.

Transformation · Typesense collection schema

Typed collection

Give Typesense the fields you filter and sort on.

  1. List fields from real queries, not from every JSON key.
  2. Set types, facets, and sort flags.
  3. Create the collection before the first import.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

Transformation · Database reader and the documents import API

Batch import

Load documents from the system of record.

  1. Read the source database in batches.
  2. Map the primary key to id.
  3. 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.

05Handle with care

The things most likely to hurt.

These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.

Pilot

The schema is missing a sort

criticalpossible likelihood

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.

Backup

You imported the index instead of the database

highpossible likelihood

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.

Cutover

Shadow week is skipped

highpossible likelihood

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.

06Precise timeline

Do the work in this order.

Estimate forOne Meilisearch index moving to a Typesense Cloud collection, rebuilt from the source database
Total elapsed10–24 business days
Active work30–70 hours
BufferAdd time for several collections, geo fields, or a multi-million document import.
01
Days 1–3Fields and queries2–3 days
02
Days 3–5Snapshot1–2 days
03
Days 5–14Import and shadow6–10 days
04
Days 14–18Repoint sync and traffic1–3 days
05
Days 17–24Two production weeks5–8 days
  1. 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 checkpoint

    Write the schema?

    Go when: Every production sort and filter is on the list.

    Stop when: A client sends a field you cannot name.

  2. 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 checkpoint

    Import?

    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.

  3. 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 checkpoint

    Cut over?

    Go when: Counts match and the query diff is signed.

    Stop when: Import errors remain in a batch.

  4. 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 checkpoint

    Stop Meilisearch writes?

    Go when: The sync completes and production queries hit Typesense.

    Stop when: The cron still writes only to Meilisearch.

  5. 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 checkpoint

    Close rollback?

    Go when: No trigger fires through the observation window.

    Stop when: Sync lag or ranking regressions show up.

07The point of change

Cut over with a way back.

Go live

Cutover

Serve search from Typesense Cloud after a shadowed week and one clean sync interval.

Recommended window: The morning after the shadow week, with the sync owner online.

  1. Import any rows changed since the snapshot.
  2. Point the incremental job at Typesense and watch one run.
  3. Switch the search client.
  4. Keep Meilisearch readable.
  5. 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.

Return to safety

Rollback

Point the client and the sync job back at Meilisearch.

Deadline: Before you delete the Meilisearch host or the database snapshot.

  1. Deploy the Meilisearch client.
  2. Point the cron back at Meilisearch.
  3. Confirm a search and an incremental update.
  4. Leave the Typesense collection in place for the retry.
  5. File the query diff that caused the rollback.

Proof to capture: Search and sync use Meilisearch again.

Rollback immediately when
  • 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
08Verification report

Prove the migration worked.

Every blocking check must pass. Capture the evidence before cleanup begins.

0%
Interactive report preview0 / 8 checks passed
PassIDCheckMethodExpected resultEvidence
V-01BlockingSorts and filtersCompare production query parameters with the collection schema.Every sort and filter field exists and has the right type.Schema review.
V-02BlockingBatch errorsRead the import response for each batch.No document errors remain.Import log.
V-03BlockingSource tableCompare collection count with the source table and the Meilisearch index.Gaps are signed.Count sheet.
V-04BlockingPrimary keySample documents and compare ids.The Typesense id matches the Meilisearch primary key.Id sample.
V-05Stop words and synonymsSearch a synonym pair and a stop word.The groups you ported behave as signed.Query sample.
V-06BlockingShadow weekReview the saved query diff.Every material change is accepted.Diff notes.
V-07BlockingOne intervalUpdate a row and wait for the cron.The Typesense document changes and Meilisearch is no longer required for that write.Sync log.
V-08BlockingScoped keyCall search with the client key and try an import with it.Search works. Import is rejected.Key test.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: The observation window, with Meilisearch still restorable.

  1. Commit the collection schema.
  2. Archive the query diff and import logs.
  3. Rotate the Meilisearch admin key.
  4. Keep the Meilisearch data directory until rollback closes.
  5. Remove the old search client from the deploy.
  6. Review Cloud capacity after real traffic, the way 3DSEARCH reviewed RAM after launch.
10Experiences from the field

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.

First-person accountHutzi3d · 3DSEARCH

3DSEARCH left Meilisearch for self-hosted Typesense2026

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.

What they recommend
  • 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.
Worth noticing
  • 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.
Sources and evidence

Verify against the primary material.

Platform behavior changes. Check these sources and the review dates above before executing a production migration.

  1. Typesense: migrating from AlgoliaAccessed 2026-11-01
  2. Meilisearch: primary keyAccessed 2026-11-01
  3. Typesense: document import APIAccessed 2026-11-01
  4. 3DSEARCH: switched to TypesenseAccessed 2026-11-01