已知限制
目前,Meilisearch 有一些已知的限制。這些限制有些是刻意設計的權衡結果,而有些則歸因於 Meilisearch 在底層使用的鍵值儲存LMDB。
本指南涵蓋了無法變更的硬性限制。Meilisearch 也有一些預設限制,這些限制可以更改,例如預設的 payload 大小限制為 100MB 和預設的搜尋結果限制為 20 筆。
查詢字詞的最大數量
限制: 每個搜尋查詢中考慮的最大字詞數量為 10 個。如果搜尋查詢包含 10 個以上的字詞,則第 10 個字詞之後的所有字詞都將被忽略。
說明: 具有多個搜尋字詞的查詢可能會導致響應時間過長。這與我們提供快速的隨打即搜尋體驗的目標背道而馳。
每個屬性的最大字詞數量
限制: Meilisearch 每個屬性最多可以索引 65535 個位置。任何超出 65535 個位置限制的字詞都會被靜默忽略。
說明: 執行此限制是為了確保相關性。在給定屬性中,字詞越多,搜尋查詢的相關性就越低。
範例
假設您有三個相似的查詢:Hello World
、Hello, World
和 Hello - World
。由於我們的斷詞器運作方式,它們中的每一個都將被不同地處理,並在我們的內部資料庫中佔用不同數量的「位置」。
如果您的查詢是 Hello World
Hello
佔用該屬性的位置0
World
佔用該屬性的位置1
如果您的查詢是 Hello, World
Hello
佔用該屬性的位置0
,
佔用該屬性的位置8
World
佔用該屬性的位置9
注意
,
佔用 8 個位置,因為它是硬分隔符號。您可以在我們的關於資料類型的文章中閱讀更多關於字詞分隔符號的資訊。
如果您的查詢是 Hello - World
Hello
佔用該屬性的位置0
-
佔用該屬性的位置1
World
佔用該屬性的位置2
注意
-
佔用 1 個位置,因為它是軟分隔符號。您可以在我們的關於資料類型的文章中閱讀更多關於字詞分隔符號的資訊。
每個文件的最大屬性數量
限制: Meilisearch 每個文件最多可以索引 65,536 個屬性。如果文件包含超過 65,536 個屬性,則會擲回錯誤。
說明: 執行此限制是為了效能和儲存原因。過大的內部資料結構(由具有太多欄位的文件導致)會導致磁碟上過大的資料庫,並降低搜尋效能。
索引中的最大文件數量
限制: 一個索引最多可以包含 4,294,967,296 個文件。
說明: 這是 32 位元無符號整數的最大可能值。由於 Meilisearch 的引擎在內部使用無符號整數來識別文件,因此這是可以在索引中儲存的最大文件數量。
同時搜尋請求的最大數量
限制: Meilisearch 最多處理 1000 個同時搜尋請求。
說明: 此限制的存在是為了防止 Meilisearch 將無限數量的請求排入佇列,並可能消耗無限量的記憶體。如果 Meilisearch 在佇列已滿時收到新請求,它會丟棄隨機的搜尋請求,並傳回 503 too_many_search_requests
錯誤,並將 Retry-After
標頭設定為 10 秒。使用--experimental-search-queue-size
設定此限制。
主索引鍵值的長度
限制: 主索引鍵值限制為 511 個位元組。
說明: Meilisearch 將主索引鍵值儲存為 LMDB 索引鍵,這是一種大小限制為 511 個位元組的資料類型。如果主索引鍵值超過 511 個位元組,則包含這些文件的任務將會失敗。
個別 filterableAttributes
值的長度
限制: 個別 filterableAttributes
值限制為 468 個位元組。
說明: Meilisearch 將 filterableAttributes
值儲存為 LMDB 中的索引鍵,這是一種大小限制為 511 個位元組的資料類型,Meilisearch 會在此基礎上增加 44 個位元組的邊距。請注意,這僅適用於個別值,例如,只要每個值小於 468 個位元組,genres
屬性就可以包含任意數量的值,例如 horror
、comedy
或 cyberpunk
。
最大篩選深度
限制: 使用filter
搜尋參數進行的搜尋可能具有最大 2000 的篩選深度。
說明: 混合和交替 AND
和 OR
運算子的篩選會建立巢狀邏輯結構。過度的巢狀可能會導致堆疊溢位。
範例
以下篩選由多個篩選表達式組成。由於這些語句都使用 OR
運算子串聯在一起,因此沒有巢狀
genre = "romance" OR genre = "horror" OR genre = "adventure"
將 OR
替換為 AND
不會變更篩選結構。以下篩選的巢狀層級保持為 1
genre = "romance" AND genre = "horror" AND genre = "adventure"
只有在交替使用 AND
和 OR
運算子時才會發生巢狀。以下範例會擷取僅屬於使用者 1
的文件,或屬於使用者 2
和 3
的文件
# AND is nested inside OR, creating a second level of nesting
user = 1 OR user = 2 AND user = 3
新增括號有助於視覺化巢狀深度
# Depth 2
user = 1 OR (user = 2 AND user = 3)
# Depth 4
user = 1 OR (user = 2 AND (user = 3 OR (user = 4 AND user = 5)))
# Though this filter is longer, its nesting depth is still 2
user = 1 OR (user = 2 AND user = 3) OR (user = 4 AND user = 5) OR user = 6
整數字段的大小
限制: Meilisearch 只能精確表示 -2⁵³ 到 2⁵³ 之間的整數。
說明: Meilisearch 將數值儲存為雙精度浮點數。這允許更高的精度,並增加 Meilisearch 可以表示的數量級範圍,但會導致超過某些臨界值的值不準確。
每次搜尋的最大結果數量
限制: 依預設,Meilisearch 每次搜尋最多傳回 1000 個文件。
說明: Meilisearch 限制了傳回的搜尋結果最大數量,以保護您的資料庫免受惡意抓取。您可以透過使用分頁索引設定的 maxTotalHits
屬性來變更此設定。maxTotalHits
僅適用於搜尋路由,對使用 POST 取得文件和使用 GET 取得文件端點沒有影響。
大型資料集和內部錯誤
限制: 在索引大量文件批次時,Meilisearch 可能會擲回內部錯誤。
說明: 索引大量文件批次(例如,大小超過 3.5GB 的 JSON 檔案)可能會導致 Meilisearch 開啟過多的檔案描述符。根據您的電腦,這可能會達到系統的預設資源使用限制並觸發內部錯誤。在執行 Meilisearch 之前,請使用 ulimit
或類似工具來增加資源消耗限制。例如,在 UNIX 環境中呼叫 ulimit -Sn 3000
以將允許開啟的檔案描述符數量提高到 3000。
最大資料庫大小
限制: Meilisearch 在 Linux 環境中支援約 80TiB 的最大索引大小。為了效能起見,Meilisearch 建議將索引保持在 2TiB 以下。
說明: 只要使用中的資料庫總大小低於作業系統分配給單一程序的最大虛擬位址空間,Meilisearch 就可以容納任何大小的索引。在 64 位元 Linux 上,此限制約為 80TiB。
最大任務資料庫大小
限制: Meilisearch 支援最大 10GiB 的任務資料庫大小。
說明: 根據您的設定,10GiB 應該對應於 5M 到 15M 個任務。一旦任務資料庫包含超過 1M 個條目(平均約為 1GiB),Meilisearch 會嘗試自動刪除已完成的任務,同時繼續像往常一樣將新任務排入佇列。這可確保任務資料庫不會使用過多的資源。如果您的資料庫達到 10GiB 的限制,Meilisearch 將會記錄警告,指出引擎無法正常運作,並拒絕將新任務排入佇列。
執行個體中的最大索引數量
限制: 只要索引的大小不超過 2TiB,Meilisearch 就可以容納任意數量的索引。在處理較大的索引時,只要它們的總大小不超過作業系統的虛擬位址空間限制,Meilisearch 最多可以容納 20 個索引。
說明: 雖然 Meilisearch 支援 2TiB 以下的任意數量的索引,但在短時間內存取數百個不同的資料庫可能會導致效能下降,應盡可能避免。
分面搜尋限制
限制: 在搜尋分面值時,Meilisearch 最多傳回 100 個分面。
說明: 對於傳回的分面最大數量的限制已實作,以便在可用性和全面結果之間提供良好的平衡。分面搜尋允許使用者篩選大量分面清單,以便他們可以快速找到與其查詢相關的類別。這與搜尋文件索引不同。分面索引設定(例如 maxValuesPerFacet
限制)不會影響分面搜尋,僅影響透過文件搜尋的查詢。