本页面旨在帮助当前 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-meilisearch-migration 的目录,并使用 npm 生成一个 package.json 文件。
algolia-meilisearch-migration
npm
package.json
mkdir algolia-meilisearch-migration cd algolia-meilisearch-migration npm init -y
这将设置安装依赖项所需的环境。
接下来,创建一个 script.js 文件
script.js
touch script.js
此文件将包含我们的迁移脚本。
要开始,您需要两个不同的包。第一个是 algoliasearch,用于 Algolia API 的 JavaScript 客户端,第二个是 meilisearch,用于 Meilisearch API 的 JavaScript 客户端。
npm install -s [email protected] [email protected]
您需要您的应用程序 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 密钥。
APPLICATION_ID
ADMIN_API_KEY
将 INDEX_NAME 替换为您要迁移到 Meilisearch 的 Algolia 索引的名称。
INDEX_NAME
要一次性获取所有 Algolia 索引数据,请使用 Algolia 的 browseObjects 方法。
browseObjects
let records = []; await algoliaIndex.browseObjects({ batch: (hits) => { records = records.concat(hits); } });
batch 回调方法在每批命中时调用,并且内容连接在 records 数组中。我们将在稍后的上传过程中再次使用 records。
batch
records
通过传递 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 将创建它。
MEILI_HOST
MEILI_API_KEY
MEILI_INDEX_NAME
接下来,使用 Meilisearch JavaScript 方法 addDocumentsInBatches 以 100,000 个批次上传所有记录。
addDocumentsInBatches
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 不同,索引设置永远不能用作参数,反之亦然。
sortableAttributes
sort
下表比较了 Algolia 的API 参数与等效的 Meilisearch 设置或搜索参数。
query
q
attributesToRetrieve
filters
filter
facets
facetDistribution
attributesToHighlight
offset
length
limit
typoTolerance
snippetEllipsisText
cropMarker
searchableAttributes
attributesForFaceting
filterableAttributes
unretrievableAttributes
displayedAttributes
attributeForDistinct
distinctAttribute
ranking
rankingRules
customRanking
removeStopWords
stopWords
synonyms
removeWordsIfNoResults
disableTypoToleranceOnAttributes
typoTolerance.disableOnAttributes
separatorsToIndex
disablePrefixOnAttributes
relevancyStrictness
maxValuesPerFacet
sortFacetValuesBy
restrictHighlightAndSnippetArrays
本节比较了 Algolia 和 Meilisearch 各自的 API 方法,以 JavaScript 作为参考。
client.initIndex()
client.index()
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)
client.listApiKeys()
client.getKeys()
client.getApiKey(string apiKey)
client.getKey(string apiKey)
client.addApiKey(array acl)
client.createKey(object configuration)
client.updateApiKey(string apiKey, object configuration)
client.updateKey(string apiKey, object configuration)
client.deleteApiKey(string apiKey)
client.deleteKey(string apiKey)
InstantSearch 是 Algolia 维护的开源工具集合,用于生成前端搜索 UI 组件。要将 InstantSearch 与 Meilisearch 一起使用,您必须使用 Instant Meilisearch。
Instant Meilisearch 是一个将您的 Meilisearch 实例与 InstantSearch 连接的插件,使您可以访问与 Algolia 用户相同的许多前端组件。您可以在 GitHub 项目的自述文件中找到 Instant Meilisearch 支持的组件的最新列表。
想包含更多详细信息? 提出问题 在我们的公共文档存储库中。