从 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 algoliasearch@4.13 meilisearch@0.25.1
创建 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 方法
本节比较 Algolia 和 Meilisearch 各自的 API 方法,并以 JavaScript 为例。
方法 | 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 支持的组件的最新列表。