跳到主要内容

过滤说明

Milvus 提供强大的过滤功能,使您能够精确查询数据。过滤表达式允许您针对特定的标量 field 并使用不同条件细化搜索结果。本指南解释如何在 Milvus 中使用过滤表达式,示例主要关注查询操作。您也可以在搜索和删除请求中应用这些过滤器。

基本操作符

Milvus 支持多种基本操作符来过滤数据:

  • 比较操作符==!=><>=<= 允许基于数字或文本 field 进行过滤。

  • 范围过滤器INLIKE 帮助匹配特定值范围或集合。

  • 算术操作符+-*/%** 用于涉及数字 field 的计算。

  • 逻辑操作符ANDORNOT 将多个条件组合成复杂表达式。

示例:按颜色过滤

要在标量 field color 中查找具有主要颜色(红、绿或蓝)的 entity,使用以下过滤表达式:

filter='color in ["red", "green", "blue"]'

示例:过滤 JSON Field

Milvus 允许引用 JSON field 中的键。例如,如果您有一个包含 pricemodel 键的 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_CONTAINSARRAY_CONTAINS_ALLARRAY_CONTAINS_ANYARRAY_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 支持倒排索引和基于术语的文本搜索。该过程包括:

  1. 分析器:对输入文本进行分词和处理。

  2. 索引:创建将唯一 token 映射到文档的倒排索引。

有关更多详细信息,请参阅文本匹配