篩選器範本機制
在 Milvus 中,包含大量元素的複雜篩選表達式,尤其是涉及非 ASCII 字元(如 CJK 字元)的表達式,可能會顯著影響查詢效能。為解決此問題,Milvus 引入了篩選表達式範本機制,旨在透過減少解析複雜表達式所需的時間來提升效率。本頁說明如何在搜尋、查詢及刪除操作中使用篩選表達式範本。
概述
篩選表達式範本機制允許您建立包含佔位符的篩選表達式,這些佔位符可在查詢執行期間動態替換為實際值。透過使用範本機制,您無需將大型陣列或複雜表達式直接嵌入篩選條件中,從而減少解析時間並提升查詢效能。
假設您有一個涉及兩個欄位的篩選表達式:age 和city ,且您希望找出所有年齡大於 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 ` 字典,您可以顯著減少解析複雜篩選表達式所需的時間。這將帶來更快的查詢執行速度和更佳的整體效能。