StructArray 概述

当某个实体需要存储结构化元素的有序列表时,应使用 StructArray,例如包含多个片段的文档、包含多个视觉片段的页面,或包含多个视频片段的视频。StructArray 将这些元素保存在父实体内部,同时仍允许对每个元素内部的字段进行向量搜索和标量过滤。

什么是 StructArray?

StructArray(也称为结构体数组)在每个实体中存储一组有序的 Struct 元素。数组中的每个 Struct 元素都遵循相同的 Schema。一个 Struct 元素可以包含标量子字段、向量字段,或两者兼有。

例如,一个Collection可以将一篇文章作为实体存储,并将该文章的片段存储在名为chunks 的StructArray字段中。每个片段可以包含文本、章节元数据、质量评分以及一个或多个向量嵌入。

{
  "doc_id": 1,
  "title": "Vector search tuning guide",
  "category": "search",
  "title_vector": [0.10, 0.20, 0.30, 0.40],
  "chunks": [
    {
      "text": "Use HNSW efSearch to trade recall for latency.",
      "section": "index",
      "page": 1,
      "quality_score": 0.92,
      "has_code": true,
      "emb_list_vector": [0.11, 0.21, 0.31, 0.41],
      "emb": [0.12, 0.20, 0.33, 0.39]
    },
    {
      "text": "Range search returns vectors within a distance boundary.",
      "section": "search",
      "page": 2,
      "quality_score": 0.86,
      "has_code": false,
      "emb_list_vector": [0.18, 0.23, 0.29, 0.36],
      "emb": [0.19, 0.24, 0.30, 0.37]
    }
  ]
}

此示例中的两个向量字段分别从两种搜索视角表示同一个片段。chunks[emb_list_vector] 用于基于MAX_SIM* 指标的 EmbeddingList 搜索,而chunks[emb] 用于基于常规向量指标(如COSINEIPL2 )的元素级搜索。

何时使用 StructArray

当您希望返回的自然单位大于用于搜索或过滤的自然单位时,请使用 StructArray。

用例StructArray 的优势典型的 StructArray 字段
文档检索将一个文档作为实体存储,同时对其各分块进行搜索。chunks
延迟交互检索将文档或页面存储为Embeddings列表,并使用MAX_SIM* 进行评分。chunks[emb_list_vector]patches[emb]
元素级检索返回相关性最高的片段、剪辑、补丁或观测结果,并包含其数组偏移量。chunks[emb]
结构化过滤根据 Struct 元素内的标量子字段(如 section、score、page 或 flags)进行过滤。chunks[section],chunks[quality_score]
减少重复的父级结果将子元素保留在同一父实体下,而不是将每个子元素作为单独的一行存储。chunks,clips,patches

决策矩阵

使用以下矩阵选择合适的 StructArray 路径。

目标推荐路径结果粒度从这里开始
模型一个具有多个结构化子对象的父对象。创建一个 StructArray 字段。实体包含有序的 Struct 元素。创建 StructArray 字段
插入包含嵌套子数据的父记录。插入其 StructArray 字段为 Struct 对象列表的实体。实体级插入。将数据插入 StructArray 字段
运行 ColBERT、ColPali 或文档级延迟交互检索。使用MAX_SIM* 索引进行EmbeddingList搜索。实体级别。使用Embeddings列表进行搜索
搜索单个片段、剪辑或片段。使用常规向量度量进行元素级搜索。结构元素级别,如有偏移量则包含偏移量。使用 StructArray 进行基本向量搜索
将元素级向量搜索限制为满足标量条件的元素。使用element_filter元素级过滤;结果形状取决于搜索类型。使用 StructArray 进行过滤搜索
根据满足条件的 Struct 元素数量来选择实体。使用MATCH_ANYMATCH_ALLMATCH_LEASTMATCH_MOSTMATCH_EXACT实体级别。StructArray 操作符
在 StructArray 向量上使用分数或距离边界。使用元素级范围搜索。结构元素级别。使用 StructArray 进行范围搜索
在元素级搜索后,每个父实体最多返回一个结果。使用主键进行分组搜索。分组后的实体级别。使用 StructArray 进行分组搜索
将 StructArray 元素搜索与另一个向量字段结合使用。使用混合搜索,其中一个 AnnSearchRequest 针对 StructArray 的向量字段。元素级子搜索,实体级重新排序。基于 StructArray 的混合搜索

了解两种搜索模型

EmbeddingList 搜索

元素级搜索

EmbeddingList搜索将StructArray向量子字段中的向量视为父实体的单一嵌入列表。查询同样是一个嵌入列表。Milvus通过MAX_SIM* 度量将查询嵌入列表与存储的嵌入列表进行比对,并返回匹配的实体。

  • 查询数据:嵌入列表。
  • 度量家族:MAX_SIM*
  • 结果粒度:实体级别。
  • 最适合:文档级或页面级的后期交互检索。

元素级搜索将每个 Struct 元素视为独立的向量搜索候选项。每个命中结果代表 StructArray 字段中匹配的元素,且未分组的结果可显示该元素的偏移量。

  • 查询数据:常规向量。
  • 度量标准家族:常规向量度量标准。
  • 结果粒度:Struct 元素级别。
  • 最适合:片段级、剪辑级或补丁级检索。

警告

如果您的 Collection 同时需要 EmbeddingList 搜索和元素级搜索,请使用两个独立的向量字段。一个向量字段或向量子字段只能接受一个索引,而且这两种搜索模式需要不同的度量族。

文档地图

StructArray 文档分为建模页面和搜索页面。请使用建模页面来定义和准备数据,使用搜索页面来选择合适的检索和过滤行为。

Area页面用途
建模创建 StructArray 字段定义结构体 Schema 并添加一个 StructArray 字段。
建模将数据插入 StructArray 字段准备并插入嵌套的 StructArray 数据。
建模为 StructArray 字段建立索引在 StructArray 子字段上创建向量和标量索引。
参考StructArray 限制检查Schema、数据类型、索引、搜索、过滤和版本限制。
搜索使用 StructArray 进行基本向量搜索比较 EmbeddingList 搜索与元素级向量搜索。
搜索使用 StructArray 进行范围搜索在 StructArray 向量子字段中使用范围约束。
搜索使用 StructArray 进行分组搜索按主键对元素级搜索结果进行分组。
搜索结合 StructArray 进行混合搜索将 StructArray 元素级搜索与其他向量搜索相结合。
搜索使用 StructArray 进行过滤搜索在搜索、查询和混合搜索中使用 StructArray 过滤器。
搜索使用Embeddings列表进行搜索利用 StructArray 构建 ColBERT 和 ColPali 风格的检索系统。
筛选StructArray 操作符element_filterMATCH_* 操作符的参考语法。

首先需检查的关键限制

  • Struct 可用作 Array 字段的元素类型,但不能用作顶级 Collection 字段。

  • 同一 StructArray 字段中的所有 Struct 元素共享一个预定义的 Schema。

  • 向量字段需要索引。EmbeddingList 搜索使用MAX_SIM* 度量,而元素级搜索则使用常规向量度量。

  • element_filter MATCH_* 适用于 StructArray 字段内的标量子字段。请仅在这些操作符内部使用 。$[subfield]

  • 某些搜索组合受版本限制或仅在特定模式下可用。在依赖范围搜索、分组搜索、混合搜索、可空字段或动态添加的字段之前,请先查阅StructArray 限制

后续步骤

  1. 要设计 Schema,请阅读《创建 StructArray 字段》

  2. 要准备数据,请阅读《将数据插入 StructArray 字段》。

  3. 要选择索引,请阅读《为StructArray 字段建立索引》

  4. 若要搜索 StructArray 向量子字段,请从《StructArray 的基本向量搜索》开始。

  5. 若要过滤 StructArray 标量子字段,请参阅《StructArray 操作符》和《使用 StructArray 进行过滤搜索》。

翻译自DeepL

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

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

免费试用 Zilliz Cloud
反馈

此页对您是否有帮助?