篩選器範本機制

在 Milvus 中,包含大量元素的複雜篩選表達式,尤其是涉及非 ASCII 字元(如 CJK 字元)的表達式,可能會顯著影響查詢效能。為解決此問題,Milvus 引入了篩選表達式範本機制,旨在透過減少解析複雜表達式所需的時間來提升效率。本頁說明如何在搜尋、查詢及刪除操作中使用篩選表達式範本。

概述

篩選表達式範本機制允許您建立包含佔位符的篩選表達式,這些佔位符可在查詢執行期間動態替換為實際值。透過使用範本機制,您無需將大型陣列或複雜表達式直接嵌入篩選條件中,從而減少解析時間並提升查詢效能。

假設您有一個涉及兩個欄位的篩選表達式:agecity ,且您希望找出所有年齡大於 25 歲,並居住於「北京」或「上海」的人。與其直接將數值嵌入篩選表達式中,您可改用模板:

filter = "age > {age} AND city IN {city}"
filter_params = {"age": 25, "city": ["北京", "上海"]}

在此,{age}{city} 為佔位符,當查詢執行時,會被filter_params 中的實際值所取代。

在 Milvus 中使用篩選表達式範本有幾個關鍵優勢:

  • 減少解析時間:透過將龐大或複雜的篩選表達式替換為佔位符,系統在解析和處理篩選條件上所花費的時間便會減少。

  • 提升查詢效能:隨著解析開銷降低,查詢效能隨之提升,從而帶來更高的每秒查詢數(QPS)與更快的回應時間。

  • 可擴展性:隨著資料集規模擴大及篩選表達式日益複雜,範本化機制可確保系統效能持續保持高效且具備可擴展性。

搜尋操作

在 Milvus 的搜尋操作中,會使用filter 表達式來定義篩選條件,並透過filter_params 參數指定佔位符的值。filter_params 字典包含 Milvus 將用於替換篩選表達式中的動態值。

expr = "age > {age} AND city IN {city}"
filter_params = {"age": 25, "city": ["北京", "上海"]}
res = client.search(
    "hello_milvus",
    vectors[:nq],
    filter=expr,
    limit=10,
    output_fields=["age", "city"],
    search_params={"metric_type": "COSINE", "params": {"search_list": 100}},
    filter_params=filter_params,
)

在此範例中,Milvus 在執行搜尋時,會將{age} 動態替換為25 ,並將{city} 動態替換為["北京", "上海"]

查詢操作

相同的模板機制亦可應用於 Milvus 的查詢操作中。在query 函式中,您定義篩選表達式,並使用filter_params 來指定要替換的值。

expr = "age > {age} AND city IN {city}"
filter_params = {"age": 25, "city": ["北京", "上海"]}
res = client.query(
    "hello_milvus",
    filter=expr,
    output_fields=["age", "city"],
    filter_params=filter_params
)

透過使用filter_params ,Milvus 能高效處理值的動態插入,從而提升查詢執行速度。

刪除操作

您亦可在刪除操作中使用篩選表達式範本。與搜尋和查詢類似,filter 表達式定義條件,而filter_params 則為佔位符提供動態值。

expr = "age > {age} AND city IN {city}"
filter_params = {"age": 25, "city": ["北京", "上海"]}
res = client.delete(
    "hello_milvus",
    filter=expr,
    filter_params=filter_params
)

此方法可提升刪除操作的效能,特別是在處理複雜篩選條件時。

結論

篩選表達式範本是優化 Milvus 查詢效能的關鍵工具。透過使用佔位符和 `filter_params ` 字典,您可以顯著減少解析複雜篩選表達式所需的時間。這將帶來更快的查詢執行速度和更佳的整體效能。

翻譯者DeepL

免費嘗試托管的 Milvus

Zilliz Cloud 無縫接入,由 Milvus 提供動力,速度提升 10 倍。

開始使用
反饋

這個頁面有幫助嗎?