Skip to main content

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 SettingMeilisearch Equivalent
searchableAttributessearchableAttributes
attributesForFacetingfilterableAttributes
customRankingrankingRules
synonymssynonyms
stopWordsstopWords
typoToleranceBuilt-in (configurable)
distinctdistinctAttribute
replicasNot 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

RecordsAlgoliaMeilisearch Self-HostedSavings
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

DayTask
Day 1Deploy Meilisearch, export + import data
Day 2Configure settings, swap frontend SDK
Day 3Update backend API calls, test search quality
Week 2Monitor search quality, fine-tune ranking
Week 3Cutover, cancel Algolia

Compare search engines on OSSAlt — performance, features, and pricing side by side.