從 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 用戶端。

    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_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 方法

    本節比較 Algolia 和 Meilisearch 各自的 API 方法,並以 JavaScript 作為參考。

    方法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 專案的 README 中找到 Instant Meilisearch 支援的元件的最新列表