从 Algolia 迁移到 Meilisearch
本指南将逐步引导您创建一个 Node.js 脚本,用于将 Algolia 索引的数据上传到 Meilisearch。
本页面旨在帮助 Algolia 的现有用户过渡到 Meilisearch。
要了解这两家搜索公司及其产品的高级比较,请参阅我们对搜索市场的分析。
概述
本指南将逐步引导您创建一个 Node.js 脚本,用于将 Algolia 索引数据上传到 Meilisearch。您也可以直接跳到已完成的脚本。
迁移过程包含三个步骤
为帮助过渡,我们还包含了 Meilisearch 和 Algolia 的 API 方法以及 前端组件的比较。
在继续之前,请确保您已安装 Meilisearch 和 Node.js,并能访问命令行终端。如果您不确定如何安装 Meilisearch,请参阅我们的快速入门。
本指南使用以下包版本进行测试
node.js
:16.16
algoliasearch
:4.13
meilisearch-js
:0.27.0
meilisearch
:0.28
导出您的 Algolia 数据
初始化项目
首先创建一个名为 algolia-meilisearch-migration
的目录,并使用 npm
生成一个 package.json
文件
这将设置我们安装依赖所需的环境。
接下来,创建一个 script.js
文件
此文件将包含我们的迁移脚本。
安装依赖
要开始,您需要两个不同的包。第一个是 algoliasearch
,它是 Algolia API 的 JavaScript 客户端;第二个是 meilisearch
,它是 Meilisearch API 的 JavaScript 客户端。
创建 Algolia 客户端
您需要您的 Application ID(应用程序 ID)和 Admin API Key(管理员 API 密钥)来启动 Algolia 客户端。两者都可以在您的 Algolia 账户中找到。
将以下代码粘贴到 script.js
中
请将 APPLICATION_ID
和 ADMIN_API_KEY
分别替换为您的 Algolia 应用程序 ID 和管理员 API 密钥。
请将 INDEX_NAME
替换为您希望迁移到 Meilisearch 的 Algolia 索引名称。
从 Algolia 获取数据
要一次性获取所有 Algolia 索引数据,请使用 Algolia 的 browseObjects
方法。
batch
回调方法会在每批次命中时被调用,内容会连接到 records
数组中。我们稍后会在上传过程中再次使用 records
。
将数据导入 Meilisearch
创建 Meilisearch 客户端
通过传入 Meilisearch 实例的主机 URL 和 API 密钥来创建 Meilisearch 客户端。最简单的选项是使用自动生成的管理员 API 密钥。
请将 MEILI_HOST
、MEILI_API_KEY
和 MEILI_INDEX_NAME
替换为您的 Meilisearch 主机 URL、Meilisearch API 密钥以及您希望添加文档的索引名称。如果该索引不存在,Meilisearch 将会创建它。
上传数据到 Meilisearch
接下来,使用 Meilisearch JavaScript 方法 addDocumentsInBatches
以 100,000 为一批上传所有记录。
就这些!当您准备运行脚本时,输入以下命令
完成脚本
配置您的索引设置
Meilisearch 的默认设置旨在提供快速且相关的搜索体验,适用于大多数用例。
要自定义您的索引设置,我们建议遵循本指南。要了解 Algolia 和 Meilisearch 中设置之间的更多差异,请继续阅读。
索引设置 vs. 搜索参数
Algolia 和 Meilisearch 之间一个关键的使用差异在于它们如何处理索引设置和搜索参数。
在 Algolia 中,API 参数是一个灵活的类别,它包含索引设置和搜索参数。许多 API 参数都可以在索引时(设置默认行为)或搜索时(覆盖该行为)使用。
在 Meilisearch 中,索引设置和搜索参数是两个不同的类别。设置会影响索引上的所有搜索,而参数则影响单次搜索的结果。
某些 Meilisearch 参数需要事先配置索引设置。例如,您必须先配置索引设置 sortableAttributes
才能使用搜索参数 sort
。然而,与 Algolia 不同,索引设置永远不能用作参数,反之亦然。
设置与参数比较
下表比较了 Algolia 的 API 参数与 Meilisearch 对应的设置或搜索参数。
Algolia | Meilisearch |
---|---|
query | q |
attributesToRetrieve | attributesToRetrieve |
filters | filter |
facets | facetDistribution |
attributesToHighlight | attributesToHighlight |
offset | offset |
length | limit |
typoTolerance | typoTolerance |
snippetEllipsisText | cropMarker |
searchableAttributes | searchableAttributes |
attributesForFaceting | filterableAttributes |
unretrievableAttributes | 无直接对应项;通过从 displayedAttributes 中移除属性实现 |
attributesToRetrieve | displayedAttributes |
attributeForDistinct | distinctAttribute |
ranking | rankingRules |
customRanking | 集成在 rankingRules 中 |
removeStopWords | stopWords |
synonyms | synonyms |
排序(使用副本) | sortableAttributes (无需副本) |
removeWordsIfNoResults | 自动支持,但不可自定义 |
disableTypoToleranceOnAttributes | typoTolerance.disableOnAttributes |
separatorsToIndex | 不支持 |
disablePrefixOnAttributes | 不支持 |
relevancyStrictness | 不支持 |
maxValuesPerFacet | maxValuesPerFacet |
sortFacetValuesBy | sortFacetValuesBy |
restrictHighlightAndSnippetArrays | 不支持 |
API 方法
本节使用 JavaScript 作为参考,比较了 Algolia 和 Meilisearch 各自的 API 方法。
方法 | Algolia | Meilisearch |
---|---|---|
索引实例化 | client.initIndex() 此处,client 是一个 Algolia 实例。 | client.index() 此处,client 是一个 Meilisearch 实例。 |
创建索引 | 当您首次添加记录或设置时,Algolia 会自动创建一个索引。 | Meilisearch 也适用同样的情况,但用户也可以显式创建索引:client.createIndex(string indexName) |
获取所有索引 | client.listIndices() | client.getIndexes() |
获取单个索引 | 无可用方法 | client.getIndex(string indexName) |
删除索引 | index.delete() | client.deleteIndex(string indexName) |
获取索引设置 | index.getSettings() | index().getSettings() |
更新索引设置 | index.setSettings(object settings) | index().updateSettings(object settings) |
搜索方法 | index.search(string query, { searchParameters, requestOptions }) | index.search(string query, object searchParameters) |
添加对象 | index.saveObjects(array objects) | index.addDocuments(array objects) |
部分更新对象 | index.partialUpdateObjects(array objects) | index.updateDocuments(array objects) |
删除所有对象 | index.deleteObjects(array objectIDs) | index.deleteAllDocuments() |
删除单个对象 | index.deleteObject(string objectID) | index.deleteDocument(string id) |
获取所有对象 | index.getObjects(array objectIDs) | index.getDocuments(object params) |
获取单个对象 | index.getObject(str objectID) | index.getDocument(string id) |
获取 API 密钥 | client.listApiKeys() | client.getKeys() |
获取 API 密钥信息 | client.getApiKey(string apiKey) | client.getKey(string apiKey) |
创建 API 密钥 | client.addApiKey(array acl) | client.createKey(object configuration) |
更新 API 密钥 | client.updateApiKey(string apiKey, object configuration) | client.updateKey(string apiKey, object configuration) |
删除 API 密钥 | client.deleteApiKey(string apiKey) | client.deleteKey(string apiKey) |
前端组件
InstantSearch 是 Algolia 维护的一系列开源工具,用于生成前端搜索 UI 组件。要将 InstantSearch 与 Meilisearch 结合使用,您必须使用 Instant Meilisearch。
Instant Meilisearch 是一个连接您的 Meilisearch 实例与 InstantSearch 的插件,让您能够像 Algolia 用户一样访问许多相同的前端组件。您可以在 GitHub 项目的 README 中找到Instant Meilisearch 支持的组件的最新列表。