从 Algolia 迁移到 Meilisearch

    此页面旨在帮助 Algolia 的现有用户迁移到 Meilisearch。

    有关这两家搜索公司及其产品的概况比较,请参阅我们对搜索市场的分析

    概述

    本指南将逐步指导您创建一个Node.js脚本,用于将 Algolia 索引数据上传到 Meilisearch。您也可以直接跳到完成的脚本

    迁移过程包括三个步骤

    1. 导出存储在 Algolia 中的数据
    2. 将数据导入 Meilisearch
    3. 配置 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 客户端。

    创建 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_IDADMIN_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_HOSTMEILI_API_KEYMEILI_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 设置搜索参数 进行比较。

    AlgoliaMeilisearch
    queryq
    attributesToRetrieveattributesToRetrieve
    filtersfilter
    facetsfacetDistribution
    attributesToHighlightattributesToHighlight
    offsetoffset
    lengthlimit
    typoTolerancetypoTolerance
    snippetEllipsisTextcropMarker
    searchableAttributessearchableAttributes
    attributesForFacetingfilterableAttributes
    unretrievableAttributes没有直接等效项;通过从 displayedAttributes 中删除属性来实现
    attributesToRetrievedisplayedAttributes
    attributeForDistinctdistinctAttribute
    rankingrankingRules
    customRanking集成在 rankingRules
    removeStopWordsstopWords
    synonymssynonyms
    排序(使用副本)sortableAttributes(不需要副本)
    removeWordsIfNoResults自动支持,但不可自定义
    disableTypoToleranceOnAttributestypoTolerance.disableOnAttributes
    separatorsToIndex不支持
    disablePrefixOnAttributes不支持
    relevancyStrictness不支持
    maxValuesPerFacetmaxValuesPerFacet
    sortFacetValuesBysortFacetValuesBy
    restrictHighlightAndSnippetArrays不支持

    API 方法

    本节使用 JavaScript 作为参考,比较了 Algolia 和 Meilisearch 的各个 API 方法。

    方法AlgoliaMeilisearch
    索引实例化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 支持的组件的最新列表