使用 Meili 搜尋 Rust 程式碼套件
展示 Meili 即時搜尋引擎,該引擎會公開來自 crates.io 的套件。

今天,我將帶領您深入探索 crates.io,並說明如何使用我們的即時搜尋引擎:Meilisearch,建立一個替代搜尋列。
Meili 即時、相關且具備容錯能力的搜尋引擎
Crates.io 是官方網站,用於儲存 Rust 社群的套件(程式碼包),也是 cargo 套件管理器上傳、更新和下載這些套件的地方。
Sean Griffin 是 crates.io 團隊的一員,負責維護其目前的搜尋引擎以及整個網站。Kornel Lesinski 建立了 lib.rs,作為 crates.io 的替代方案,並使用 Tantivy 來驅動其搜尋列。老實說,我比較喜歡它的色彩設計,這就是我將其用於我們的搜尋示範的原因。
我決定執行我們的即時搜尋引擎,並隨著時間的推移,測試其相較於這些現有解決方案的相關性。我們的搜尋引擎使用完全不同的演算法;它基於前綴搜尋,並具備容錯能力。
Meili 具備容錯能力,並支援許多其他功能
所以,我問自己:為什麼不使用我們新的即時搜尋引擎,使其對我熱愛的社群有所幫助?這會在過程中給予我們許多回饋,並可能獲得一些 Pull Request。
在 Meili,我們管理一個內部 Kubernetes 叢集,這有助於為客戶託管示範。此示範的 Meilisearch 伺服器目前在此叢集中的 Pod 上執行。
為了讓 Meilisearch 展示這些程式碼套件,我們需要找到 crates.io 上目前所有可用的套件。幸運的是,此索引在 GitHub 上以多個子資料夾的形式提供,其中包含套件的名稱和版本,大約有 32,000 個檔案。每次程式碼套件更新到新版本或版本被撤回時,都會進行提交。
因此,我使用 crates.io-index 儲存庫來初始化我們新建立的 Meili 搜尋引擎,但首先需要更多資料,例如每個程式碼套件的描述、關鍵字和類別。Rust crates.io 團隊再次在此為我們提供協助,我與 Pietro Albini 進行了交談,他向我指出了不會受速率限制的伺服器,這些伺服器會傳遞套件內容。
既然我們可以擷取有用的資料,我便建立一個 非同步爬蟲,其會下載、解壓縮、擷取 Cargo.toml,並將基本資料上傳至 Meilisearch。
顯示原始文件的 Meili 儀表板介面
Meilisearch 現在可以理解這些資料,並為我們提供即時、相關且具備容錯能力的響應。但是,新的程式碼套件呢?我們希望收到有關新程式碼套件的通知,並能夠將它們傳送到 Meilisearch。
Docs.rs 是官方網站,用於計算和儲存 crates.io 所託管的所有 Rust 套件的相關文件。它每分鐘都會比較 crates.io 索引,以了解新的程式碼套件更新。幸運的是,它提供了這些更新的 Atom 摘要。
這就是 Heroku 的用武之地。Heroku 每月在其伺服器上提供大約 1000 個小時的免費運算能力,並為我們提供排程器。我們可以利用這些額度,並透過提取 Atom 摘要,免費地每 10 分鐘向 docs.rs 查詢有關新更新的程式碼套件,像以前一樣下載更新的套件,並最終即時更新我們的搜尋引擎!
擷取新的程式碼套件需要 4 秒
搜尋結果令人滿意,但並未達到預期,有些問題。例如,當我們輸入「serde」時,第一個結果是相關的,但接下來的結果卻不是。這與 Meilisearch 除了查詢匹配的單字之外,沒有足夠的資料來評級程式碼套件有關。
Meilisearch 不知道如何僅使用匹配的單字來確定同等程式碼套件的優先順序
下載次數顯著改善了搜尋結果。此資料可透過 crates.io 取得。每天都會進行完整的資料庫匯出,其中包含每個程式碼套件的下載次數。我決定使用這些作為最後一個排名依據,以協助 Meilisearch 確定被視為同等的程式碼套件的優先順序。
由於下載次數,Meilisearch 顯示更好的結果
我部署了一個 Heroku 排程器,使其每天執行,以更新所有程式碼套件的下載次數;下載 tarball、解壓縮、讀取 CSV 並將 32,000 個程式碼套件的下載次數上傳至 Meilisearch 大約需要 30 秒。因此,我們遠遠沒有用完每月 1000 個免費小時。
我認為這個搜尋示範相當不錯,但我也考慮加入同義詞和停用詞,因為 Meilisearch 支援這些。例如,輸入「db」並查看與「資料庫」相關的結果會很方便。停用詞將有助於忽略諸如「the」或「that」之類的無用單字,這些單字有時可能會污染搜尋結果,但我們需要小心,因為程式碼套件名稱可能由停用詞組成。
Meilisearch 也支援基本篩選,未來能夠在類別中或使用特定關鍵字搜尋程式碼套件會很棒。
您可以進行所有這些改進;此示範是開放原始碼。核心引擎原始碼 也可在 GitHub 上取得,這就是本文的重點!看看並討論它,更多人參與,更多功能!