How to Migrate from Algolia to Meilisearch
·OSSAlt Team
algoliameilisearchmigrationsearchguide
How to Migrate from Algolia to Meilisearch
Algolia's pricing is based on search requests and records. At scale, costs reach $1-10K+/month. Meilisearch is the open source alternative — typo-tolerant, fast, and free to self-host. The migration is straightforward because Meilisearch supports InstantSearch.
Step 1: Deploy Meilisearch
# Docker
docker run -d \
--name meilisearch \
-p 7700:7700 \
-v meili_data:/meili_data \
-e MEILI_MASTER_KEY=your-master-key \
getmeili/meilisearch:latest
Step 2: Export from Algolia
// Export Algolia index to JSON
const algoliasearch = require('algoliasearch');
const fs = require('fs');
const client = algoliasearch('APP_ID', 'ADMIN_API_KEY');
const index = client.initIndex('products');
let allRecords = [];
await index.browseObjects({
batch: (objects) => { allRecords = allRecords.concat(objects); }
});
fs.writeFileSync('products.json', JSON.stringify(allRecords));
console.log(`Exported ${allRecords.length} records`);
Step 3: Import to Meilisearch
const { MeiliSearch } = require('meilisearch');
const products = require('./products.json');
const client = new MeiliSearch({
host: 'http://localhost:7700',
apiKey: 'your-master-key',
});
// Create index and add documents
const index = client.index('products');
await index.addDocuments(products);
// Configure searchable attributes (like Algolia's settings)
await index.updateSearchableAttributes([
'name', 'description', 'category', 'brand'
]);
// Configure filterable attributes (like Algolia's facets)
await index.updateFilterableAttributes([
'category', 'brand', 'price', 'inStock'
]);
// Configure sortable attributes
await index.updateSortableAttributes(['price', 'rating']);
Step 4: Update Frontend (InstantSearch)
Meilisearch supports Algolia's InstantSearch via an adapter:
npm install @meilisearch/instant-meilisearch
Before (Algolia):
import algoliasearch from 'algoliasearch';
import instantsearch from 'instantsearch.js';
const searchClient = algoliasearch('APP_ID', 'SEARCH_KEY');
const search = instantsearch({
indexName: 'products',
searchClient,
});
After (Meilisearch):
import { instantMeiliSearch } from '@meilisearch/instant-meilisearch';
import instantsearch from 'instantsearch.js';
const { searchClient } = instantMeiliSearch(
'http://localhost:7700',
'your-search-key'
);
const search = instantsearch({
indexName: 'products',
searchClient,
});
That's it. Same InstantSearch widgets, same UI — just a different search client. All your existing hits, searchBox, refinementList, pagination widgets continue working.
Step 5: Configure Settings
Map Algolia settings to Meilisearch:
| Algolia Setting | Meilisearch Equivalent |
|---|---|
searchableAttributes | searchableAttributes |
attributesForFaceting | filterableAttributes |
customRanking | rankingRules |
synonyms | synonyms |
stopWords | stopWords |
typoTolerance | Built-in (configurable) |
distinct | distinctAttribute |
replicas | Not needed (sort at query time) |
Step 6: Update Backend API Calls
Before:
const index = algoliaClient.initIndex('products');
const results = await index.search('query', { filters: 'price < 100' });
After:
const index = meiliClient.index('products');
const results = await index.search('query', { filter: 'price < 100' });
The API is very similar — most changes are just import swaps.
Cost Comparison
| Records | Algolia | Meilisearch Self-Hosted | Savings |
|---|---|---|---|
| 10K | $50/month | $5/month (VPS) | $540/year |
| 100K | $200/month | $10/month | $2,280/year |
| 1M | $500+/month | $20/month | $5,760/year |
Migration Timeline
| Day | Task |
|---|---|
| Day 1 | Deploy Meilisearch, export + import data |
| Day 2 | Configure settings, swap frontend SDK |
| Day 3 | Update backend API calls, test search quality |
| Week 2 | Monitor search quality, fine-tune ranking |
| Week 3 | Cutover, cancel Algolia |
Compare search engines on OSSAlt — performance, features, and pricing side by side.