v0.29 版本的新功能
這個月的版本帶來了一個期待已久的新功能:匹配策略自訂。它也帶來了許多關於索引速度、篩選器和金鑰管理的改進。

本文探討了 Meilisearch 最新版本中的一些主要變更。如需更多詳細資訊,請閱讀 GitHub 上的完整變更日誌。
新功能:匹配策略
v0.29 引入了一個新的搜尋參數:matchingStrategy
。此參數可讓您在搜尋時定義 Meilisearch 應如何匹配查詢詞
last
:首先返回包含所有查詢詞的文件。然後,透過減少匹配中出現的查詢詞數量來檢索其他結果:Meilisearch 將一次刪除一個查詢詞,從查詢的末尾開始,並將任何新的匹配項包含在結果列表中。自 v0.21 以來,這一直是預設行為,並且將保持預設策略。all
:僅返回包含所有查詢詞的文件。
範例
curl \ -X POST '<https://127.0.0.1:7700/indexes/movies/search>' \ -H 'Content-Type: application/json' \ --data-binary '{ "q": "american ninja", "matchingStrategy": "all" }'
透過上述請求,Meilisearch 將僅返回同時包含「american」和「ninja」的文件。
我們希望這個新功能能鼓勵那些仍在使用 v0.20(預設使用 all
匹配策略的最後一個官方 Meilisearch 版本)的人升級到我們的最新版本,並從那時起引入的新功能中受益:排序、地理搜尋、細緻的 API 金鑰權限等等!如果您仍在 v0.20 上,並且認為您暫時不會升級,我們很樂意知道是什麼在阻止您。
您可以使用匹配策略示範來測試此功能,並在專門的部落格文章中了解更多資訊。改進:索引效能
我們加快了索引速度,特別是針對以下操作
- 刻面索引:我們修改了演算法,以提高可篩選屬性的索引速度
- 文件刪除和更新
- 我們引入了軟刪除。這是一種技術,其中使用旗標將資料標記為已刪除,使其無法被所有使用者存取,而實際上不會從資料庫中刪除。文件會在稍後刪除,以免佔用裝置上過多的空間。因此,刪除磁碟上記錄所需的時間會延後,並且不會延遲索引程序。
- 重新索引時,Meilisearch 現在會偵測是否存在完全相同版本的文件,如果存在,則不會再次建立索引
行為變更:自動批次處理
在 v0.26 中,我們引入了一個實驗性功能:自動批次處理。啟用後,自動批次處理會自動合併連續的文件新增請求,從而顯著加快索引程序。
我們很高興地宣布自動批次處理現在是預設索引行為,不再是實驗性功能🥳
這表示您不再需要使用 **--enable-auto-batching**
CLI 旗標來啟用它。使用 --enable-auto-batching
現在會擲回以下錯誤
error: Found argument '--enable-auto-batching' which wasn't expected, or isn't valid in this context Did you mean '--disable-auto-batching'? If you tried to supply `--enable-auto-batching` as a value rather than a flag, use `-- --enable-auto-batching` USAGE: meilisearch --disable-auto-batching
以下自動批次處理自訂選項也已移除,如果使用將會擲回錯誤,因此請確保您的應用程式在升級到 v0.29 之前未使用它們
--debounce-duration-sec
--max-batch-size
--max-documents-per-batch
如果您尚未啟用自動批次處理功能,您無需執行任何操作,只需享受提高的索引速度即可 🏎️
🧐 您可能已在上面的錯誤訊息中注意到:如果由於某些原因您不希望 Meilisearch 自動批次處理請求,則可以使用新的 CLI 旗標來停用此功能:--disable-auto-batching
。
我們不斷致力於改進我們的搜尋引擎,您的意見回饋至關重要。如果您在文件索引速度方面遇到任何問題,如果您可以在此討論中告知我們,我們將非常感激。
改進:篩選器
我們新增了兩個新的篩選器運算子:IN
和 EXISTS
IN
運算子會選取指定欄位包含至少一個給定值的所有文件EXISTS
運算子會檢查欄位是否存在。請注意,具有空白或空值的欄位仍然計為存在
假設有以下書籍資料集
[ { "id": 1, "title": "Pride and Prejudice", "genres": ["romance"] }, { "id": 2, "title": "Le Petit Prince", "genres": [] }, { "id": 3, "title": "Alice In Wonderland" }, { "id": 4, "title": "The Hobbit", "genres": ["adventure", "fantasy"] }, { "id": 5, "title": "A Game of Thrones", "genres": ["fantasy"] }, ]
表達式 genres IN [fantasy, adventure]
將會傳回文件 4
和 5
。
表達式 genres EXISTS
將會傳回文件 1
、2
、4
和 5
。
這兩個運算子都可以與 NOT
(!=
) 運算子組合使用。
行為變更:!=
(NOT
) 篩選器運算子
!=
(NOT
) 篩選器運算子會傳回不滿足條件的文件。
考慮以下文件
{ "id": 1, "product": "T-shirt", "price": 20 } { "id": 2, "product": "T-shirt" } { "id": 3, "product": "T-shirt", "price": 30 }
NOT price = 20
應傳回 price 屬性不等於 20 的所有文件。
在 v0.29 中,!=
(NOT
) 篩選器會比對缺少指定屬性的文件。在上面的範例中,這表示 Meilisearch 會傳回文件 2
和 3
。
在 v0.29 之前,Meilisearch 不會包含缺少 price
屬性的結果。在上面的範例中,v0.28 只會傳回文件 3
。
您可以使用新的 EXISTS
運算子與 !=
(NOT
) 運算子來確保篩選器只傳回包含指定屬性的文件:price EXISTS AND price != 20
只會傳回文件 3
。
改進:金鑰管理
在管理金鑰時,在 actions
陣列中使用 *
萬用字元會提供對所有端點的存取權
{ "name": "Default Admin API Key", "description": "Use it for anything that is not a search operation. Caution! Do not expose it on a public frontend", "key": "380689dd379232519a54d15935750cc7625620a2ea2fc06907cb40ba5b421b6f", "uid": "20f7e4c4-612c-4dd1-b783-7934cc038213", "actions": ["*"], "indexes": ["*"], "expiresAt": null, "createdAt": "2021-08-11T10:00:00Z", "updatedAt": "2021-08-11T10:00:00Z" }
現在,由於我們的貢獻者,它也可以作為萬用字元,表示單一路線的所有端點 🙌
您無需列出每個端點,而是可以在所需的路線中附加 *
字元。例如,documents.*
授權存取所有與文件相關的端點。
改進:泰語支援
我們親愛的貢獻者 @aFluffyHotdog 引入了泰語的最佳化支援 🥳
我們一直在尋找使 Meilisearch 的語言支援變得更好的方法。我們從母語人士那裡獲得的意見回饋越多,我們就越容易了解如何提高這些語言的效能和搜尋相關性。
想要幫助我們支援您的語言嗎?貢獻一份力量!如果您需要指導或協助,請隨時聯繫我們;我們期待與您合作!
貢獻者
如果沒有社群的支持,Meilisearch 不會像今天一樣。你們真的非常棒,我們非常感謝你們為 Meilisearch 付出的所有努力、建議、評論和時間。這個月,我們要特別感謝@evpeople、@Mcdostone、@pavo-tusker、@phdavis1027、@ryanrussell 和 @VasiliySoldatkin 對 Meilisearch 的幫助;感謝 @GraDKh 對 Milli 的幫助;以及感謝 @aFluffyHotdog、@matthias-wright 和 @mosuka 對我們的斷詞器 Charabia 的幫助。
這就是全部啦!記得查看更新日誌以了解完整的發佈說明,我們下次見!