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_APPENDupsert withfield_ops将有效载荷元素追加到现有的 ARRAY 字段中。在 Milvus v2.6.17 及更高版本中可用。
ARRAY_REMOVEupsertfield_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 数组同时包含2324 的所有实体,可使用:

filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'

这将返回所有history_temperatures 数组中同时包含这两个指定值的实体。

ARRAY_CONTAINS_ANY

ARRAY_CONTAINS_ANY 操作符用于检查数组字段中是否包含指定列表中的任意一个元素。当您希望匹配数组中至少包含一个指定值的实体时,此操作符非常有用。

示例

若要查找history_temperatures 数组中包含2324 任一值的实体,可使用以下代码:

filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'

这将返回所有history_temperatures 数组中至少包含2324 其中一个值的实体。

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_opsARRAY_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_opsARRAY_REMOVE 附加到字段,可为该字段启用部分更新语义。有关完整工作流、支持的元素类型和限制,请参阅合并模式下的Upsert ARRAY字段

翻译自DeepL

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

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

免费试用 Zilliz Cloud
反馈

此页对您是否有帮助?