过滤器模板机制
在 Milvus 中,包含大量元素的复杂过滤表达式(尤其是涉及 CJK 字符等非 ASCII 字符的表达式)会显著影响查询性能。为解决这一问题,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 ` 字典,您可以显著减少解析复杂过滤表达式所花费的时间。这将带来更快的查询执行速度和更佳的整体性能。