ARRAY 操作符
Milvus 提供了 ARRAY 操作符,用于过滤 ARRAY 字段以及部分更新 ARRAY 字段的值。
数组中的所有元素必须是同一类型,数组中的嵌套结构将被视为普通字符串。因此,在处理 ARRAY 字段时,建议避免过深的嵌套,并确保数据结构尽可能扁平,以获得最佳性能。
Milvus 中的 ARRAY 操作符涵盖两种使用场景:
用于查询和搜索的过滤表达式。
upsert请求中的部分更新。
可用的 ARRAY 操作符
下表列出了 Milvus 中可用的 ARRAY 操作符。
| 操作符 | 适用场景 | 描述 |
|---|---|---|
| ARRAY_CONTAINS(标识符, 表达式) | 过滤表达式 | 检查特定元素是否存在于 ARRAY 字段中。 |
| ARRAY_CONTAINS_ALL(标识符, 表达式) | 筛选表达式 | 检查指定列表中的所有元素是否都存在于 ARRAY 字段中。 |
| ARRAY_CONTAINS_ANY(标识符, 表达式) | 筛选表达式 | 检查指定列表中的任何元素是否存在于 ARRAY 字段中。 |
| ARRAY_LENGTH(标识符) | 筛选表达式 | 返回 ARRAY 字段中的元素个数,可与比较操作符结合用于筛选。 |
| ARRAY_APPEND | upsert withfield_ops | 将有效载荷元素追加到现有的 ARRAY 字段中。在 Milvus v2.6.17 及更高版本中可用。 |
| ARRAY_REMOVE | upsert 与field_ops | 从现有 ARRAY 字段中移除所有与请求有效载荷中某个值匹配的元素。适用于 Milvus v2.6.17 及更高版本。 |
ARRAY_CONTAINS
ARRAY_CONTAINS 操作符用于检查数组字段中是否存在特定元素。当您需要查找数组中包含给定元素的实体时,此操作符非常有用。
示例
假设有一个名为history_temperatures 的数组字段,其中包含不同年份的最低气温记录。若要查找数组中包含值23 的所有实体,可使用以下过滤表达式:
filter = 'ARRAY_CONTAINS(history_temperatures, 23)'
这将返回所有在history_temperatures 数组中包含值23 的实体。
ARRAY_CONTAINS_ALL
ARRAY_CONTAINS_ALL 操作符确保指定列表中的所有元素均存在于数组字段中。当您需要匹配数组中包含多个值的实体时,此操作符非常有用。
示例
若要查找history_temperatures 数组同时包含23 和24 的所有实体,可使用:
filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'
这将返回所有history_temperatures 数组中同时包含这两个指定值的实体。
ARRAY_CONTAINS_ANY
ARRAY_CONTAINS_ANY 操作符用于检查数组字段中是否包含指定列表中的任意一个元素。当您希望匹配数组中至少包含一个指定值的实体时,此操作符非常有用。
示例
若要查找history_temperatures 数组中包含23 或24 任一值的实体,可使用以下代码:
filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'
这将返回所有history_temperatures 数组中至少包含23 或24 其中一个值的实体。
ARRAY_LENGTH
ARRAY_LENGTH 返回数组字段的长度(元素个数)。它仅接受一个参数:数组字段标识符。
示例
要查找history_temperatures 数组中元素少于10个的所有实体:
filter = 'ARRAY_LENGTH(history_temperatures) < 10'
这将返回所有history_temperatures 数组元素数少于10个的实体。
ARRAY_APPENDCompatible with Milvus 2.6.17+
ARRAY_APPEND 操作符在执行 `upsert ` 请求时,将有效载荷元素追加到现有的 ARRAY 字段中。它不是过滤表达式。当您希望向数组添加值,而无需先查询当前数组值时,请使用该操作符。
以下 Python 示例将 `"premium" ` 追加到主键为 `1` 的实体的 `tags ` `ARRAY` 字段中:
from pymilvus import FieldOp, MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
client.upsert(
collection_name="users",
data=[{"pk": 1, "tags": ["premium"]}],
field_ops={"tags": FieldOp.array_append()},
)
通过field_ops 将ARRAY_APPEND 附加到字段上,可为该字段启用部分更新语义。有关完整工作流、支持的元素类型和限制,请参阅合并模式下的Upsert ARRAY字段。
ARRAY_REMOVECompatible with Milvus 2.6.17+
ARRAY_REMOVE 操作符会在upsert 请求期间,从现有 ARRAY 字段中移除所有与请求负载中某个值匹配的元素。它并非过滤表达式。当您希望从数组中移除匹配值,且无需先查询当前数组值时,请使用此操作符。
以下 Python 示例将从主键为1 的实体的tags ARRAY 字段中移除"trial" :
from pymilvus import FieldOp, MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
client.upsert(
collection_name="users",
data=[{"pk": 1, "tags": ["trial"]}],
field_ops={"tags": FieldOp.array_remove()},
)
通过field_ops 将ARRAY_REMOVE 附加到字段,可为该字段启用部分更新语义。有关完整工作流、支持的元素类型和限制,请参阅合并模式下的Upsert ARRAY字段。