跳到主要内容

过滤模板

在 Milvus 中,包含大量元素的复杂过滤表达式,特别是涉及非 ASCII 字符(如 CJK 字符)的表达式,可能会显著影响查询性能。为了解决这个问题,Milvus 引入了过滤表达式模板机制,旨在通过减少解析复杂表达式的时间来提高效率。本页面解释如何在搜索、查询和删除操作中使用过滤表达式模板。

概述

过滤表达式模板允许您创建带有占位符的过滤表达式,这些占位符可以在查询执行期间动态替换为值。使用模板,您可以避免将大型数组或复杂表达式直接嵌入到过滤器中,从而减少解析时间并提高查询性能。

假设您有一个涉及两个 field 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 字典,您可以显著减少解析复杂过滤表达式所花费的时间。这导致更快的查询执行和更好的整体性能。