從 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 支援的元件的最新列表。