结构数组操作符Compatible with Milvus 3.0.x
实体中的结构数组(或 StructArray)存储了一组有序的结构元素。数组中的每个 Struct 都共享相同的预定义 Schema,其中包括多个向量和标量字段。当对 Struct 中的标量子字段进行索引时,可以使用匹配系列中的 元素过滤器和操作符对其执行标量过滤。
元素过滤器会选择在 StructArray 字段中至少包含一个与指定谓词匹配的值的实体。相比之下,匹配族操作符用于查找在符合指定谓词的结构数组字段中包含特定数量或比例值的实体。
在针对$[subField] 构建谓词时,如果要处理大规模数据集,请确保对子字段进行索引,因为这些操作符需要为每个候选实体遍历数组元素。
元素过滤器
当需要检查实体的 StructArray 字段中是否包含与特定谓词匹配的值时,可以使用元素过滤器。
element_filter(chunks, $[text] LIKE "Red%")
如上面的元素过滤器表达式所示,元素过滤器返回在text 子字段中至少包含一个以 "Red "开头的块的实体。第一个参数是 StructArray 字段的名称,第二个参数是适用于 Struct 子字段的谓词。
您可以使用比较、范围和算术操作符来构建条件,还可以使用逻辑操作符来连接多个条件,如基本操作符中所示。
不过,在构建同时包含实体级谓词和元素过滤器的过滤器表达式时,应始终将元素 fltler 放在最后,如下例所示。
# correct
id > 0 && element_filter(chunks, $[x] > 1)
# incorrect, resulting errors
element_filter(chunks, $[x] > 1) && id > 0
匹配族操作符
匹配族操作符也可以在 StructArray 字段上操作。您可以确定有多少元素(或多大比例)必须满足元素谓词,而不是简单地检查元素是否存在。
MATCH_ANY(identifier, predicate):返回在text子字段中至少包含一个以 "Red "开头的块的实体;从语义上讲,这等同于element_filter。MATCH_ALL(identifier, predicate)Red:返回所有分块的文本子字段都以 "Red "开头的实体。MATCH_LEAST(identifier, predicate, k)k:返回至少包含text子字段中以 "Red "开头的块的实体。MATCH_MOST(identifier, predicate, k)RED:返回在text子字段中最多包含以 "Red "开头的k块的实体。MATCH_EXACT(identifier, predicate, k)MATCH_ANY :返回在text子字段中恰好包含以 "Red "开头的k块的实体。
MATCH_ANY
如果数组中至少有一个元素满足谓词,则此操作符的值为 true,这表示逻辑OR 的结构等价于所有数组元素。
MATCH_ANY 操作符和元素过滤器在语义上是相同的,可以交替使用。当需要表达逻辑count(matches) >= 1 时,应使用它们。
示例
下面的示例返回文档中任何部分以 "Red "开头的实体。
MATCH_ANY(chunks, $[text] LIKE 'Red%')
MATCH_ALL
只有当数组中的每个元素都满足谓词时,该操作符才会求值为 true。
当您需要表达逻辑count(matches) == total elements 时,请使用此操作符。
示例:MATCH_LEAST
MATCH_ALL(chunks, $[text] LIKE 'Red%')
MATCH_LEAST
该操作符是一个定量过滤器,如果满足谓词的元素数大于或等于指定常数 k,则返回 true。
当您需要表达逻辑count(matches) >= k 时,请使用此操作符。
示例:MATCH_MOST
MATCH_LEAST(chunks, $[text] LIKE 'Red%', 3)
MATCH_MOST
此操作符是一个定量过滤器,如果满足谓词的元素数小于或等于指定常数 k,则返回 true。
这对于过滤掉过度瞄准特定关键词的实体特别有用(减少噪音)。
示例:MATCH_EXACT
MATCH_MOST(chunks, $[text] LIKE 'Red%', 3)
匹配
该操作符是该系列中限制性最强的定量操作符。当且仅当满足谓词的元素数恰好为 k 时,它才返回 true。
示例:MATCH_EXACT
MATCH_EXACT(chunks, $[text] LIKE 'Red%', 3)