Migrating from Algolia to Meilisearch

    This page aims to help current users of Algolia make the transition to Meilisearch.

    For a high-level comparison of the two search companies and their products, see our analysis of the search market.

    Overview

    This guide will take you step-by-step through the creation of a Node.js script to upload Algolia index data to Meilisearch. You can also skip directly to the finished script.

    The migration process consists of three steps:

    1. Export your data stored in Algolia
    2. Import your data into Meilisearch
    3. Configure your Meilisearch index settings (optional)

    To help with the transition, we have also included a comparison of Meilisearch and Algolia's API methods and front-end components.

    Before continuing, make sure you have both Meilisearch and Node.js installed and have access to a command-line terminal. If you're unsure how to install Meilisearch, see our quick start.

    NOTE

    This guide was tested with the following package versions:

    Export your Algolia data

    Initialize project

    Start by creating a directory algolia-meilisearch-migration and generating a package.json file with npm:

    mkdir algolia-meilisearch-migration
    cd algolia-meilisearch-migration
    npm init -y
    

    This will set up the environment we need to install dependencies.

    Next, create a script.js file:

    touch script.js
    

    This file will contain our migration script.

    Install dependencies

    To get started, you'll need two different packages. The first is algoliasearch, the JavaScript client for the Algolia API, and the second is meilisearch, the JavaScript client for the Meilisearch API.

    npm install -s algoliasearch@4.13 meilisearch@0.25.1
    

    Create Algolia client

    You'll need your Application ID and Admin API Key to start the Algolia client. Both can be found in your Algolia account.

    Paste the below code in script.js:

    const algoliaSearch = require("algoliasearch");
    
    const algoliaClient = algoliaSearch(
      "APPLICATION_ID",
      "ADMIN_API_KEY"
    );
    const algoliaIndex = algoliaClient.initIndex("INDEX_NAME");
    

    Replace APPLICATION_ID and ADMIN_API_KEY with your Algolia application ID and admin API key respectively.

    Replace INDEX_NAME with the name of the Algolia index you would like to migrate to Meilisearch.

    Fetch data from Algolia

    To fetch all Algolia index data at once, use Algolia's browseObjects method.

    let records = [];
    await algoliaIndex.browseObjects({
        batch: (hits) => {
          records = records.concat(hits);
        }
      });
    

    The batch callback method is invoked on each batch of hits and the content is concatenated in the records array. We will use records again later in the upload process.

    Import your data into Meilisearch

    Create Meilisearch client

    Create a Meilisearch client by passing the host URL and API key of your Meilisearch instance. The easiest option is to use the automatically generated admin API key.

    const { MeiliSearch } = require("meilisearch");
    
    const meiliClient = new MeiliSearch({
      host: "MEILI_HOST",
      apiKey: "MEILI_API_KEY",
    });
    const meiliIndex = meiliClient.index("MEILI_INDEX_NAME");
    

    Replace MEILI_HOST,MEILI_API_KEY, and MEILI_INDEX_NAME with your Meilisearch host URL, Meilisearch API key, and the index name where you would like to add documents. Meilisearch will create the index if it doesn't already exist.

    Upload data to Meilisearch

    Next, use the Meilisearch JavaScript method addDocumentsInBatches to upload all your records in batches of 100,000.

    const BATCH_SIZE = 100000;
    await meiliIndex.addDocumentsInBatches(records, BATCH_SIZE);
    

    That's all! When you're ready to run the script, enter the below command:

    node script.js
    

    Finished script

    const algoliaSearch = require("algoliasearch");
    const { MeiliSearch } = require("meilisearch");
    
    const BATCH_SIZE = 1000;
    
    (async () => {
      const algoliaClient = algoliaSearch("APPLICATION_ID", "ADMIN_API_KEY");
      const algoliaIndex = algoliaClient.initIndex("INDEX_NAME");
    
      let records = [];
      await algoliaIndex.browseObjects({
        batch: (hits) => {
          records = records.concat(hits);
        }
      });
    
      const meiliClient = new MeiliSearch({
        host: "MEILI_HOST",
        apiKey: "MEILI_API_KEY",
      });
      const meiliIndex = meiliClient.index("MEILI_INDEX_NAME");
    
      await meiliIndex.addDocumentsInBatches(records, BATCH_SIZE);
    })();
    

    Configure your index settings

    Meilisearch's default settings are designed to deliver a fast and relevant search experience that works for most use-cases.

    To customize your index settings, we recommend following this guide. To learn more about the differences between settings in Algolia and Meilisearch, read on.

    Index settings vs. search parameters

    One of the key usage differences between Algolia and Meilisearch is how they approach index settings and search parameters.

    In Algolia, API parameters is a flexible category that includes both index settings and search parameters. Many API parameters can be used both at indexing time—to set default behavior—or at search time—to override that behavior.

    In Meilisearch, index settings and search parameters are two distinct categories. Settings affect all searches on an index, while parameters affect the results of a single search.

    Some Meilisearch parameters require index settings to be configured beforehand. For example, you must first configure the index setting sortableAttributes to use the search parameter sort. However, unlike in Algolia, an index setting can never be used as a parameter and vice versa.

    Settings and parameters comparison

    The below table compares Algolia's API parameters with the equivalent Meilisearch setting or search parameter.

    AlgoliaMeilisearch
    queryq
    attributesToRetrieveattributesToRetrieve
    filtersfilter
    facetsfacetDistribution
    attributesToHighlightattributesToHighlight
    offsetoffset
    lengthlimit
    typoTolerancetypoTolerance
    snippetEllipsisTextcropMarker
    searchableAttributessearchableAttributes
    attributesForFacetingfilterableAttributes
    unretrievableAttributesNo direct equivalent; achieved by removing attributes from displayedAttributes
    attributesToRetrievedisplayedAttributes
    attributeForDistinctdistinctAttribute
    rankingrankingRules
    customRankingIntegrated within rankingRules
    removeStopWordsstopWords
    synonymssynonyms
    Sorting(using replicas)sortableAttributes (no replicas required)
    removeWordsIfNoResultsAutomatically supported, but not customizable
    disableTypoToleranceOnAttributestypoTolerance.disableOnAttributes
    separatorsToIndexNot Supported
    disablePrefixOnAttributesNot Supported
    relevancyStrictnessNot Supported
    maxValuesPerFacetmaxValuesPerFacet
    sortFacetValuesBysortFacetValuesBy
    restrictHighlightAndSnippetArraysNot Supported

    API methods

    This section compares Algolia and Meilisearch's respective API methods, using JavaScript for reference.

    MethodAlgoliaMeilisearch
    Index Instantiationclient.initIndex()
    Here, client is an Algolia instance.
    client.index()
    Here, client is a Meilisearch instance.
    Create IndexAlgolia automatically creates an index the first time you add a record or settings.The same applies to Meilisearch, but users can also create an index explicitly: client.createIndex(string indexName)
    Get All Indexesclient.listIndices()client.getIndexes()
    Get Single IndexNo method availableclient.getIndex(string indexName)
    Delete Indexindex.delete()client.deleteIndex(string indexName)
    Get Index Settingsindex.getSettings()index().getSettings()
    Update Index Settingsindex.setSettings(object settings)index().updateSettings(object settings)
    Search Methodindex.search(string query, { searchParameters, requestOptions })index.search(string query, object searchParameters)
    Add Objectindex.saveObjects(array objects)index.addDocuments(array objects)
    Partial Update Objectindex.partialUpdateObjects(array objects)index.updateDocuments(array objects)
    Delete All Objectsindex.deleteObjects(array objectIDs)index.deleteAllDocuments()
    Delete One Objectindex.deleteObject(string objectID)index.deleteDocument(string id)
    Get All Objectsindex.getObjects(array objectIDs)index.getDocuments(object params)
    Get Single Objectindex.getObject(str objectID)index.getDocument(string id)
    Get API Keysclient.listApiKeys()client.getKeys()
    Get API Key Infoclient.getApiKey(string apiKey)client.getKey(string apiKey)
    Create API Keyclient.addApiKey(array acl)client.createKey(object configuration)
    Update API Keyclient.updateApiKey(string apiKey, object configuration)client.updateKey(string apiKey, object configuration)
    Delete API Keyclient.deleteApiKey(string apiKey)client.deleteKey(string apiKey)

    Front-end components

    InstantSearch is a collection of open-source tools maintained by Algolia and used to generate front-end search UI components. To use InstantSearch with Meilisearch, you must use Instant Meilisearch.

    Instant Meilisearch is a plugin connecting your Meilisearch instance with InstantSearch, giving you access to many of the same front-end components as Algolia users. You can find an up-to-date list of the components supported by Instant Meilisearch in the GitHub project's README.