从 Algolia 迁移到 Meilisearch
此页面旨在帮助 Algolia 的现有用户迁移到 Meilisearch。
有关这两家搜索公司及其产品的概况比较,请参阅我们对搜索市场的分析。
概述
本指南将逐步指导您创建一个Node.js脚本,用于将 Algolia 索引数据上传到 Meilisearch。您也可以直接跳到完成的脚本。
迁移过程包括三个步骤
为了帮助您完成过渡,我们还提供了 Meilisearch 和 Algolia 的API 方法和前端组件的比较。
在继续之前,请确保您已安装 Meilisearch 和 Node.js,并且可以访问命令行终端。如果您不确定如何安装 Meilisearch,请参阅我们的快速入门。
导出 Algolia 数据
初始化项目
首先创建一个名为 algolia-meilisearch-migration
的目录,并使用 npm
生成一个 package.json
文件
mkdir algolia-meilisearch-migration
cd algolia-meilisearch-migration
npm init -y
这将设置我们安装依赖项所需的运行环境。
接下来,创建一个 script.js
文件
touch script.js
此文件将包含我们的迁移脚本。
安装依赖项
首先,您需要两个不同的软件包。第一个是 algoliasearch
,它是 Algolia API 的 JavaScript 客户端,第二个是 meilisearch
,它是 Meilisearch API 的 JavaScript 客户端。
npm install -s [email protected] [email protected]
创建 Algolia 客户端
您需要您的**应用程序 ID**和**管理员 API 密钥**才能启动 Algolia 客户端。两者都可以在您的Algolia 帐户中找到。
将以下代码粘贴到 script.js
中
const algoliaSearch = require("algoliasearch");
const algoliaClient = algoliaSearch(
"APPLICATION_ID",
"ADMIN_API_KEY"
);
const algoliaIndex = algoliaClient.initIndex("INDEX_NAME");
请将 APPLICATION_ID
和 ADMIN_API_KEY
分别替换为您的 Algolia 应用 ID 和管理员 API 密钥。
请将 INDEX_NAME
替换为您想要迁移到 Meilisearch 的 Algolia 索引名称。
从 Algolia 获取数据
要立即获取所有 Algolia 索引数据,请使用 Algolia 的 browseObjects
方法。
let records = [];
await algoliaIndex.browseObjects({
batch: (hits) => {
records = records.concat(hits);
}
});
batch
回调方法会在每次获取一批命中结果时调用,并且内容会在 records
数组中进行拼接。我们稍后会在上传过程中再次使用 records
。
将您的数据导入 Meilisearch
创建 Meilisearch 客户端
通过传递 Meilisearch 实例的主机 URL 和 API 密钥来创建 Meilisearch 客户端。最简单的方法是使用自动生成的 管理员 API 密钥。
const { MeiliSearch } = require("meilisearch");
const meiliClient = new MeiliSearch({
host: "MEILI_HOST",
apiKey: "MEILI_API_KEY",
});
const meiliIndex = meiliClient.index("MEILI_INDEX_NAME");
请将 MEILI_HOST
、MEILI_API_KEY
和 MEILI_INDEX_NAME
分别替换为您的 Meilisearch 主机 URL、Meilisearch API 密钥以及您想要添加文档的索引名称。如果索引不存在,Meilisearch 会自动创建它。
将数据上传到 Meilisearch
接下来,使用 Meilisearch JavaScript 方法 addDocumentsInBatches
以 100,000 批次的形式上传所有记录。
const BATCH_SIZE = 100000;
await meiliIndex.addDocumentsInBatches(records, BATCH_SIZE);
就是这样!当您准备好运行脚本时,请输入以下命令
node script.js
完成的脚本
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);
})();
配置索引设置
Meilisearch 的默认设置旨在提供快速且相关的搜索体验,适用于大多数用例。
要自定义索引设置,我们建议您遵循 本指南。要详细了解 Algolia 和 Meilisearch 设置之间的差异,请继续阅读。
索引设置与搜索参数
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 项目的自述文件中找到 Instant Meilisearch 支持的组件的最新列表。