Overview
This guide will take you step-by-step through the creation of a script to upload Algolia index data to Meilisearch. Examples are provided in JavaScript, Python, and Ruby. You can also skip directly to the finished script. The migration process consists of three steps:- Export your data stored in Algolia
- Import your data into Meilisearch
- Configure your Meilisearch index settings (optional)
This guide includes examples in JavaScript, Python, and Ruby. The packages used:
- JavaScript:
algoliasearch4.x,meilisearch(compatible with Meilisearch v1.0+) - Python:
algoliasearch4.x,meilisearch - Ruby:
algolia3.x,meilisearch
Export your Algolia data
Initialize project
Install dependencies
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 your script file: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’sbrowseObjects method.
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.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, useaddDocumentsInBatches to upload all your records in batches of 100,000.
Finished script
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 settingsortableAttributes 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. The Type column indicates whether the Meilisearch equivalent is a search parameter (param), an index setting (setting), or both.Query and pagination
| Algolia | Meilisearch | Type |
|---|---|---|
query | q | param |
offset | offset | param |
length | limit | param |
page | page | param |
hitsPerPage | hitsPerPage | param |
paginatedHits limit | pagination.maxTotalHits | setting |
Filtering and sorting
| Algolia | Meilisearch | Type |
|---|---|---|
filters | filter | param |
facets | facets | param |
attributesForFaceting | filterableAttributes | setting |
maxValuesPerFacet | faceting.maxValuesPerFacet | setting |
sortFacetValuesBy | faceting.sortFacetValuesBy | setting |
maxFacetHits | facetSearch | setting |
| Sorting (using replicas) | sortableAttributes + sort param (no replicas required) | setting + param |
distinct | distinct (per-query) or distinctAttribute (index-wide) | param + setting |
attributeForDistinct | distinctAttribute | setting |
Geo search
| Algolia | Meilisearch | Type |
|---|---|---|
aroundLatLng / aroundRadius | _geoRadius(lat, lng, radius) in filter | param |
insideBoundingBox | _geoBoundingBox([lat, lng], [lat, lng]) in filter | param |
insidePolygon | _geoPolygon([lat, lng], [lat, lng], ...) in filter | param |
aroundPrecision | No direct equivalent | — |
Highlighting and snippets
| Algolia | Meilisearch | Type |
|---|---|---|
attributesToHighlight | attributesToHighlight | param |
highlightPreTag | highlightPreTag | param |
highlightPostTag | highlightPostTag | param |
attributesToSnippet | attributesToCrop + cropLength | param |
snippetEllipsisText | cropMarker | param |
restrictHighlightAndSnippetArrays | Not supported | — |
Attributes and ranking
| Algolia | Meilisearch | Type |
|---|---|---|
searchableAttributes | searchableAttributes | setting |
restrictSearchableAttributes | attributesToSearchOn | param |
attributesToRetrieve | attributesToRetrieve | param |
unretrievableAttributes | No direct equivalent; achieved by removing attributes from displayedAttributes | setting |
ranking | rankingRules | setting |
customRanking | Integrated within rankingRules | setting |
getRankingInfo | showRankingScore / showRankingScoreDetails | param |
Typo tolerance and language
| Algolia | Meilisearch | Type |
|---|---|---|
typoTolerance | typoTolerance | setting |
disableTypoToleranceOnAttributes | typoTolerance.disableOnAttributes | setting |
removeStopWords | stopWords | setting |
synonyms | synonyms | setting |
separatorsToIndex | separatorTokens / nonSeparatorTokens | setting |
naturalLanguages | localizedAttributes setting + locales param | setting + param |
queryType (prefix matching) | prefixSearch | setting |
removeWordsIfNoResults | Automatically supported via matchingStrategy param | param |
AI and vector search
| Algolia | Meilisearch | Type |
|---|---|---|
NeuralSearch mode | hybrid param + embedders setting | setting + param |
enableReRanking | Integrated in hybrid search | param |
| AI personalization | personalize | param |
Other
| Algolia | Meilisearch | Type |
|---|---|---|
analytics / clickAnalytics | Separate Analytics API | — |
disablePrefixOnAttributes | Not supported | — |
relevancyStrictness | rankingScoreThreshold | param |
API methods
This section compares Algolia and Meilisearch’s respective API methods, using JavaScript for reference.| Method | Algolia | Meilisearch |
|---|---|---|
| Index Instantiation | client.initIndex()Here, client is an Algolia instance. | client.index()Here, client is a Meilisearch instance. |
| Create Index | Algolia 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 Indexes | client.listIndices() | client.getIndexes() |
| Get Single Index | No method available | client.getIndex(string indexName) |
| Delete Index | index.delete() | client.deleteIndex(string indexName) |
| Get Index Settings | index.getSettings() | index.getSettings() |
| Update Index Settings | index.setSettings(object settings) | index.updateSettings(object settings) |
| Search Method | index.search(string query, { searchParameters, requestOptions }) | index.search(string query, object searchParameters) |
| Add Object | index.saveObjects(array objects) | index.addDocuments(array objects) |
| Partial Update Object | index.partialUpdateObjects(array objects) | index.updateDocuments(array objects) |
| Delete All Objects | index.deleteObjects(array objectIDs) | index.deleteAllDocuments() |
| Delete One Object | index.deleteObject(string objectID) | index.deleteDocument(string id) |
| Get All Objects | index.getObjects(array objectIDs) | index.getDocuments(object params) |
| Get Single Object | index.getObject(str objectID) | index.getDocument(string id) |
| Get API Keys | client.listApiKeys() | client.getKeys() |
| Get API Key Info | client.getApiKey(string apiKey) | client.getKey(string apiKey) |
| Create API Key | client.addApiKey(array acl) | client.createKey(object configuration) |
| Update API Key | client.updateApiKey(string apiKey, object configuration) | client.updateKey(string apiKey, object configuration) |
| Delete API Key | client.deleteApiKey(string apiKey) | client.deleteKey(string apiKey) |