过滤模板
在 Milvus 中,包含大量元素的复杂过滤表达式,特别是涉及非 ASCII 字符(如 CJK 字符)的表达式,可能会显著影响查询性能。为了解决这个问题,Milvus 引入了过滤表达式模板机制,旨在通过减少解析复杂表达式的时间来提高效率。本页面解释如何在搜索、查询和删除操作中使用过滤表达式模板。
概述
过滤表达式模板允许您创建带有占位符的过滤表达式,这些占位符可以在查询执行期间动态替换为值。使用模板,您可以避免将大型数组或复杂表达式直接嵌入到过滤器中,从而减少解析时间并提高查询性能。
假设您有一个涉及两个 field 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
字典,您可以显著减少解析复杂过滤表达式所花费的时间。这导致更快的查询执行和更好的整体性能。