跳到主要内容

StructArray 限制

StructArray 支持范围涵盖 Schema 定义、insert payload、Index、Search mode,以及 StructArray 专用 Filter。在生产中依赖 StructArray 行为前,请使用本文作为限制参考。

大多数 StructArray 限制来自三个方面:StructArray Schema 模型、为 Vector subfield 选择的 Search mode,以及 Collection 运行所在的 Zilliz Cloud 版本。

限制概览

范围限制
Schema 形状Struct 只能用作 Array Field 的 element type。不支持将 Struct 作为顶层 Collection Field。
Subfield Schema同一个 StructArray Field 中的所有 Struct 元素共享一个预定义 Struct Schema。
Capacitymax_capacity 是必需的,并限制一个 Entity 可以在 StructArray Field 中存储多少个 Struct 元素。
Subfield 变更创建 StructArray Field 后,不能向该现有 StructArray Field 添加 subfield。
Subfield path对 Index、Search 目标、Output Field 和 Filter 使用 chunks[emb]structArray[subfield] path。不要使用 chunks.emb
Insert 形状将 StructArray Field 作为对象数组插入。不要在 insert payload 内使用路径语法。
Vector Index一个 Vector Field 或 Vector subfield 只能接受一个 Index。EmbeddingList Search 和 Element-level Search 请使用独立的 Vector subfield。
FunctionsStructArray Field 内部的 Field 或 subfield 不支持 Field function。
Nullable FieldNullable StructArray Field 受版本限制。支持时,null 作用于整个 StructArray Field,而不是单个 Struct 元素。
Dynamic add Field向现有 Collection 添加 StructArray Field 受版本限制,并要求新增 Field 为 Nullable。

Schema 限制

限制详情
Struct 不是顶层 Field type。使用 datatype=DataType.ARRAYelement_type=DataType.STRUCTstruct_schema 创建 StructArray Field。
所有元素共享一个 Schema。StructArray Field 中的每个 Struct 元素都遵循相同的 subfield 列表和 subfield 数据类型。
max_capacity 是必需的。一个 Entity 中 Struct 元素数量不能超过 StructArray Field 配置的 max_capacity
现有 subfield 是固定的。不能向现有 StructArray Field 追加新的 subfield。如需更改 subfield Schema,请删除 StructArray Field,然后使用更新后的 Schema 重新添加。
不支持嵌套 StructArray。StructArray Field 不能包含嵌套的 ArrayArrayOfVectorStructArrayOfStruct subfield。
StructArray 内部不支持 Function。不要为 StructArray Field 或其 subfield 定义 Field function。

关于 Schema 创建示例,请参阅 创建 StructArray Field

支持的 subfield 数据类型

StructArray subfield 会映射到物理上的数组式存储。下表列出支持和不支持的物理类型。

Struct subfield 物理类型支持情况说明
Array<Bool>支持将 subfield 定义为 DataType.BOOL
Array<Int8/Int16/Int32/Int64>支持将 subfield 定义为 DataType.INT8DataType.INT16DataType.INT32DataType.INT64
Array<Float/Double>支持将 subfield 定义为 DataType.FLOATDataType.DOUBLE
Array<VarChar>支持将 subfield 定义为 DataType.VARCHAR 并设置 max_length
ArrayOfVector<FloatVector>支持将 subfield 定义为 DataType.FLOAT_VECTOR 并设置 dim
ArrayOfVector<Float16Vector>支持将 subfield 定义为 DataType.FLOAT16_VECTOR 并设置 dim
ArrayOfVector<BFloat16Vector>支持将 subfield 定义为 DataType.BFLOAT16_VECTOR 并设置 dim
ArrayOfVector<Int8Vector>支持将 subfield 定义为 DataType.INT8_VECTOR 并设置 dim
ArrayOfVector<BinaryVector>支持将 subfield 定义为 DataType.BINARY_VECTOR 并设置 dim
ArrayOfVector<SparseFloatVector>不支持StructArray Field 不支持 Sparse vector subfield。
Array<String>不支持使用 VARCHAR,不要使用 String
Array<JSON>不支持StructArray Field 不支持 JSON subfield。
Array<Geometry>不支持StructArray Field 不支持 Geometry subfield 和 GIS function。
Array<Text>不支持StructArray Field 不支持 Text subfield。
Array<Timestamptz>不支持StructArray Field 不支持 Timestamptz subfield 和 time-specific expression。
嵌套的 ArrayArrayOfVectorStructArrayOfStruct不支持StructArray Field 不支持嵌套数组、Vector 数组、Struct 或 Array-of-Struct subfield。

Nullable 和 dynamic schema 限制

Nullable StructArray 行为和动态添加 StructArray Field 都受版本限制。

能力限制
Nullable StructArray Field仅在包含 Nullable StructArray 和 Nullable Vector 数组支持的版本中可用。
Python 中的 null value在 Python 中使用 None 插入 null StructArray value。不要使用 Nullnull
Null 作用范围Null 作用于整个 StructArray Field。例如,只有当 chunks 为 Nullable 时,chunks=None 才有效。
部分为 null 的 StructArray value当 StructArray Field 包含有效数组值时,不要在同一个 value 中混合 null subfield array 和有效 subfield array。
Dynamic add StructArray Field仅在包含 dynamic StructArray Field 支持的版本中可用。
Dynamic add 的 Nullable 要求向现有 Collection 添加的 StructArray Field 必须是 Nullable,因为已有 Entity 没有新 Field 的值。
Dynamic add 后的已有 Entity已有 Entity 会在新增 StructArray Field 的所有 subfield 上返回 null

在 Milvus v3.0.x 中,Nullable StructArray Field、Nullable Vector 数组和动态添加 StructArray Field 可用。

在兼容 Milvus v3.0.x 的 cluster 中,Nullable StructArray Field、Nullable Vector 数组和动态添加 StructArray Field 可用。

关于 Nullable StructArray Field 的插入示例,请参阅 向 StructArray Field 插入数据

插入限制

限制详情
Payload 结构将 StructArray Field 作为 Struct 对象数组插入,例如 chunks: [{"text": "...", "emb": [...]}]
Subfield 名称在每个 Struct 对象内部使用 textemb 等 subfield 名称,不要使用 chunks[text] 等 path。
Schema 对齐每个 Struct 元素都必须匹配 Struct Schema。
容量一个 Entity 中 Struct 元素数量不能超过 max_capacity
Vector dimensionVector 值必须匹配对应 Vector subfield 配置的 dim
搜索模式重复如果同时需要 EmbeddingList Search 和 Element-level Search,请将 Vector 写入两个独立的 Vector subfield。

Index 和 metric 限制

StructArray Vector subfield 可以为 EmbeddingList Search 或 Element-level Search 创建 Index。同一个 Vector subfield 不能同时使用两个 metric 类型族,因为每个 Vector Field 或 Vector subfield 只能接受一个 Index。

Search modeMetric 类型族结果层级
EmbeddingList SearchMAX_SIMMAX_SIM_COSINEMAX_SIM_IPMAX_SIM_L2,或 binary MAX_SIM_* metricEntity 级结果。
Element-level SearchL2IPCOSINEHAMMINGJACCARD 等常规 Vector metricElement-level 结果,可包含匹配元素偏移量。

同时需要两种模式时,请使用独立的 Vector subfield。例如,使用 chunks[emb_list_vector] 做 EmbeddingList Search,使用 chunks[emb] 做 Element-level Search。

规划 Collection Schema 时,StructArray Vector subfield 会计入 Vector subfield。请确保 Vector Field 和 Vector subfield 总数符合目标版本和服务层级的限制。

关于支持的 Index type 和 metric type matrix,请参阅 为 StructArray Field 创建 Index

Search 限制

Search 行为支持情况和限制
Basic EmbeddingList Search支持在使用 MAX_SIM* metric 创建 Index 的 StructArray Vector subfield 上执行。返回 Entity 级结果。
Basic Element-level Search支持在使用常规 Vector metric 创建 Index 的 StructArray Vector subfield 上执行。可以返回匹配元素偏移量。
Range Search根据目标版本的 Search mode 和 Index/metric 支持情况而定。对于 Element-level StructArray request 的 Hybrid Search range 行为,请检查目标版本。
Grouping SearchElement-level Grouping Search 可以返回偏移量。Element-level StructArray request 的 Hybrid Search group-by 行为受版本限制。
Hybrid Search只有目标版本支持对应搜索组合时,Hybrid Search request 才可以包含 StructArray Vector subfield request。每个 request 仍遵循已创建 Index 的 Vector subfield metric 类型族。
Offset output偏移量可用于 Element-level Search 结果。EmbeddingList Search 返回 Entity 级结果,并且不以元素偏移量作为主要结果单元。

Filter 和 operator 限制

StructArray Scalar Filtering 由 element_filterMATCH_* family 等 StructArray operator 处理。详细 predicate support matrix 请参阅 StructArray 操作符

概括来说:

  • 只在 StructArray operator 内部使用 $[subfield]

  • 使用 Scalar subfield 编写 Scalar predicate。

  • 不要将 Vector subfield 用作 $[...] Scalar predicate 输入。

  • StructArray Element-level predicate 不支持 JSON path syntax、JSON function、array container function、text match function、Geometry / GIS function 和 Timestamptz expression。

  • 优先使用 $[has_code] == true 等显式布尔比较,而不是裸布尔表达式。

  1. 要创建 StructArray Field,请阅读 创建 StructArray Field

  2. 要插入数据,请阅读 向 StructArray Field 插入数据

  3. 要创建 Vector 和 Scalar Index,请阅读 为 StructArray Field 创建 Index

  4. 要查看 StructArray Filter syntax,请阅读 StructArray 操作符

Ctrl I