StructArray 操作符

StructArray 操作符通过评估 StructArray 字段内标量子字段上的谓词来过滤实体。请将本页作为 `element_filter ` 以及 `MATCH_* ` 操作符家族的语法参考。

StructArray 过滤包含两个操作符家族:

操作符家族主要用途结果行为
element_filter匹配满足标量谓词的 Struct 元素。在元素级搜索中,匹配结果可能包含元素偏移量。在行级查询或过滤搜索中,结果的结构取决于 API 和输出字段。
MATCH_*根据满足标量谓词的 Struct 元素数量来选择实体。行级过滤。这些操作符本身不会返回元素偏移量。

在 StructArray 操作符中使用标量子字段。向量字段用于向量搜索路径,不能作为标量谓词的输入。

何时使用哪个操作符

目标用法
将元素级向量搜索限制为符合标量条件的元素。element_filter
匹配同一 Struct 元素内的多个标量条件。element_filter
仅返回至少有一个 Struct 元素满足谓词的实体。MATCH_ANY
仅返回所有 Struct 元素均满足某个谓词的实体。MATCH_ALL
仅返回至少、至多或恰好N 个Struct元素满足某个谓词的实体。MATCH_LEAST、MATCH_MOST 或MATCH_EXACT

元素过滤器

使用element_filter(structArrayField, predicate) 来匹配StructArray字段中的Struct元素。

在谓词内部,使用$[subfield] 来引用当前 Struct 元素的标量子字段。

element_filter(chunks, $[section] == "index")

当谓词内部使用多个条件时,所有$[subfield] 引用均适用于同一个 Struct 元素:

element_filter(chunks, $[section] == "index" && $[quality_score] > 0.9)

当将实体级谓词与 `element_filter` 结合使用时,请将 `element_filter ` 置于表达式末尾:

# Correct
category == "index" && element_filter(chunks, $[quality_score] > 0.9)

# Incorrect
element_filter(chunks, $[quality_score] > 0.9) && category == "index"

element_filter 在过滤表达式中只能出现一次。请勿将element_filter 或MATCH_* 嵌套在另一个element_filter 中。

匹配族操作符

当需要根据满足谓词的 Struct 元素数量来选择实体时,请使用MATCH_* 操作符。

操作符含义
MATCH_ANY(field, predicate)至少有一个 Struct 元素满足谓词。
MATCH_ALL(field, predicate)所有 Struct 元素都满足该谓词。
MATCH_LEAST(field, predicate, threshold=N)至少有N 个Struct元素满足谓词。
MATCH_MOST(field, predicate, threshold=N)至多有N 个Struct元素满足该谓词。
MATCH_EXACT(field, predicate, threshold=N)恰有N 个Struct元素满足该谓词。

MATCH_ANY element_filter 均可表示至少有一个 Struct 元素满足该谓词。当仅需行级过滤时,请使用 。当需要元素级约束时(例如过滤哪些 Struct 元素参与元素级向量搜索),请使用 。MATCH_ANY element_filter

MATCH_ANY

MATCH_ANY 如果 StructArray 中至少有一个元素满足谓词,则其求值结果为true 。

MATCH_ANY(chunks, $[section] == "index")

对于空的 StructArray,MATCH_ANY 返回false 。

MATCH_ALL

MATCH_ALL 如果 StructArray 中的每个元素都满足该谓词,则计算结果为true 。

MATCH_ALL(chunks, $[has_code] == true)

对于空的 StructArray,MATCH_ALL 返回true 。

MATCH_LEAST

MATCH_LEAST 如果满足谓词的元素个数大于或等于threshold ,则true 的计算结果为 。

MATCH_LEAST(chunks, $[quality_score] > 0.9, threshold=2)

对于MATCH_LEAST ,threshold 必须是一个正整数。

MATCH_MOST

MATCH_MOST 如果满足谓词的元素个数小于或等于threshold ,则计算结果为true 。

MATCH_MOST(chunks, $[has_code] == true, threshold=1)

对于MATCH_MOST ,threshold 可以是零或一个正整数。

MATCH_EXACT

MATCH_EXACT 如果满足谓词的元素个数恰好等于threshold ,则true 的计算结果为 。

MATCH_EXACT(chunks, $[section] == "filter", threshold=1)

对于MATCH_EXACT ,threshold 可以是零或一个正整数。

支持的谓词

$[...] 语法表示当前 Struct 元素的标量值。谓词的支持情况取决于标量子字段的类型。

子字段类型元素级谓词支持
BOOL诸如$[has_code] == true 或!($[has_code] == true) 之类的标量谓词。请避免使用诸如$[has_code] 之类的裸布尔表达式。
INT8、INT16 、INT32 、INT64比较运算、链式范围、in 、not in 、包含+ 、- 、* 、/ 或% 并随后跟有比较运算的算术表达式,以及逻辑组合。
FLOAT,DOUBLE比较、链式范围、in 、not in 、包含+ 、- 、* 或/ 的算术表达式后跟比较,以及逻辑组合。% 操作符不支持浮点子字段。
VARCHAR字符串比较、链式范围、in 、not in 、like 、=~ 、!~ 以及逻辑组合。
向量子场不支持作为$[...] 标量谓词的输入。请改用EmbeddingList搜索或元素级向量搜索来处理向量子字段。

诸如&& 、\|\| 和! 等逻辑操作符适用于谓词表达式。例如,请写!($[has_code] == true) 而不是!$[has_code] 。

不支持的谓词

元素级$[...] 谓词不支持:

  • 文本匹配函数,例如text_match(field, "...") 或phrase_match(field, "...") 。

  • JSON路径语法、对JSON路径的exists 操作,或诸如json_contains 、json_contains_all 或json_contains_any 等JSON函数。

  • 数组容器函数,例如array_contains 、array_contains_all 、array_contains_any 或array_length 。

  • $[subfield] is null 或$[subfield] is not null 。

  • 几何/GIS 函数。

  • timestamptz 表达式。

  • random_sample(...).

  • 字段级向量谓词。

  • 通用过滤函数调用,除非特定函数的签名和执行路径明确支持 StructArray 元素级谓词。

语法规则

  • MATCH_* 操作符名称不区分大小写。

  • 仅在element_filter 或MATCH_* 谓词内部使用$[subfield] 。

  • 请勿将$[subfield] 用作 JSON 路径、数组容器或向量字段引用。

  • 请勿将element_filter 或MATCH_* 嵌套在另一个StructArray操作符中。

  • 请使用命名threshold=N 来表示MATCH_LEAST 、MATCH_MOST 和MATCH_EXACT 。

  • MATCH_ANY 对空的 StructArray 调用时,返回false 。

  • MATCH_ALL 对空的 StructArray 调用时,返回true 。

另请参阅

翻译自DeepL

想要更快、更简单、更好用的 Milvus SaaS服务 ?

Zilliz Cloud是基于Milvus的全托管向量数据库,拥有更高性能,更易扩展,以及卓越性价比

免费试用 Zilliz Cloud
反馈

此页对您是否有帮助?