过滤说明
Milvus 提供强大的过滤功能,使您能够精确查询数据。过滤表达式允许您针对特定的标量 field 并使用不同条件细化搜索结果。本指南解释如何在 Milvus 中使用过滤表达式,示例主要关注查询操作。您也可以在搜索和删除请求中应用这些过滤器。
基本操作符
Milvus 支持多种基本操作符来过滤数据:
-
比较操作符:
==
、!=
、>
、<
、>=
和<=
允许基于数字或文本 field 进行过滤。 -
范围过滤器:
IN
和LIKE
帮助匹配特定值范围或集合。 -
算术操作符:
+
、-
、*
、/
、%
和**
用于涉及数字 field 的计算。 -
逻辑操作符:
AND
、OR
和NOT
将多个条件组合成复杂表达式。
示例:按颜色过滤
要在标量 field color
中查找具有主要颜色(红、绿或蓝)的 entity,使用以下过滤表达式:
filter='color in ["red", "green", "blue"]'
示例:过滤 JSON Field
Milvus 允许引用 JSON field 中的键。例如,如果您有一个包含 price
和 model
键的 JSON field product
,并且想要查找具有特定型号且价格低于 1,850 的产品,使用此过滤表达式:
filter='product["model"] == "JSN-087" AND product["price"] < 1850'
示例:过滤 Array Field
如果您有一个 array field history_temperatures
,包含自 2000 年以来观测站报告的平均温度记录,并且想要找到 2009 年(第 10 个记录)温度超过 23°C 的观测站,使用此表达式:
filter='history_temperatures[10] > 23'
有关这些基本操作符的更多信息,请参阅基本操作符。
过滤表达式模板
当使用 CJK 字符进行过滤时,由于字符集更大和编码差异,处理可能更复杂。这可能导致性能下降,特别是使用 IN
操作符时。
Milvus 引入过滤表达式模板来优化处理 CJK 字符时的性能。通过将动态值从过滤表达式中分离,查询引擎更高效地处理参数插入。
示例
要查找年龄超过 25 岁且生活在"北京"或"上海"的个人,使用以下模板表达式:
filter = "age > 25 AND city IN ['北京', '上海']"
为了提高性能,使用带参数的变体:
filter = "age > {age} AND city in {city}",
filter_params = {"age": 25, "city": ["北京", "上海"]}
这种方法减少了解析开销并提高了查询速度。有关更多信息,请参阅过滤模板。
数据类型特定操作符
Milvus 为特定数据类型提供高级过滤操作符,如 JSON、ARRAY 和 VARCHAR field。
JSON field 特定操作符
Milvus 提供用于查询 JSON field 的高级操作符,实现复杂 JSON 结构内的精确过滤:
JSON_CONTAINS(identifier, jsonExpr)
:检查 JSON 表达式是否存在于 field 中。
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter='json_contains(tags, "sale")'
JSON_CONTAINS_ALL(identifier, jsonExpr)
:确保 JSON 表达式的所有元素都存在。
# JSON data: {"tags": ["electronics", "sale", "new", "discount"]}
filter='json_contains_all(tags, ["electronics", "sale", "new"])'
JSON_CONTAINS_ANY(identifier, jsonExpr)
:过滤 JSON 表达式中至少存在一个元素的 entity。
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter='json_contains_any(tags, ["electronics", "new", "clearance"])'
有关 JSON 操作符的更多详细信息,请参阅 JSON 操作符。
ARRAY field 特定操作符
Milvus 为 array field 提供高级过滤操作符,如 ARRAY_CONTAINS
、ARRAY_CONTAINS_ALL
、ARRAY_CONTAINS_ANY
和 ARRAY_LENGTH
,允许对数组数据进行细粒度控制:
ARRAY_CONTAINS
:过滤包含特定元素的 entity。
filter="ARRAY_CONTAINS(history_temperatures, 23)"
ARRAY_CONTAINS_ALL
:过滤列表中所有元素都存在的 entity。
filter="ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])"
ARRAY_CONTAINS_ANY
:过滤包含列表中任何元素的 entity。
filter="ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])"
ARRAY_LENGTH
:基于数组长度进行过滤。
filter="ARRAY_LENGTH(history_temperatures) < 10"
有关数组操作符的更多详细信息,请参阅 ARRAY 操作符。
VARCHAR field 特定操作符
Milvus 为 VARCHAR field 上的精确基于文本的搜索提供专门的操作符:
TEXT_MATCH
操作符
TEXT_MATCH
操作符允许基于特定查询术语进行精确文档检索。它对于结合标量过滤器与向量相似性搜索的过滤搜索特别有用。与语义搜索不同,文本匹配专注于精确术语出现。
Milvus 使用 Tantivy 支持倒排索引和基于术语的文本搜索。该过程包括:
-
分析器:对输入文本进行分词和处理。
-
索引:创建将唯一 token 映射到文档的倒排索引。
有关更多详细信息,请参阅文本匹配。