StructArray 概述

當某個實體需要儲存結構化元素的有序清單時,請使用 StructArray,例如包含多個區塊的單一文件、包含多個視覺區塊的單一頁面,或是包含多個片段的單一影片。StructArray 會將這些元素保留在父實體內,同時仍允許針對每個元素內的欄位進行向量搜尋與標量篩選。

什麼是 StructArray?

StructArray(亦稱為結構體陣列)會在每個實體中儲存一組有序的 Struct 元素。陣列中的每個 Struct 元素皆遵循相同的結構。一個 Struct 元素可以包含標量子欄位、向量子欄位,或兩者兼具。

舉例來說,一個集合可以將一篇文章儲存為一個實體,並將其片段儲存於名為 `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] 則旨在用於搭配一般向量指標(例如COSINE 、IP 或L2 )的元素層級搜尋。

何時使用 StructArray

當您希望回傳的自然單位大於您要進行搜尋或篩選的自然單位時,請使用 StructArray。

使用情境StructArray 的優勢典型的 StructArray 欄位
文件檢索將單一文件儲存為實體,同時跨其各區塊進行搜尋。chunks
延遲互動檢索將文件或頁面儲存為嵌入向量清單,並透過 `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 或文件層級的延遲互動檢索。使用 EmbeddingList 搜尋,並搭配MAX_SIM* 索引。實體層級。使用嵌入式清單進行搜尋
搜尋個別片段、剪輯或區塊。使用常規向量度量進行元素層級搜尋。結構元素層級,若有偏移量則一併納入。使用 StructArray 進行基本向量搜尋
將元素層級向量搜尋限制為符合標量條件的元素。使用 `element_filter`。元素級篩選;結果的形狀取決於搜尋類型。使用 StructArray 進行篩選搜尋
根據滿足某個條件的 Struct 元素數量來選取實體。請使用MATCH_ANY 、MATCH_ALL 、MATCH_LEAST 、MATCH_MOST 或MATCH_EXACT 。實體層級。StructArray 運算子
在 StructArray 向量子欄位上使用分數或距離邊界。使用元素層級的範圍搜尋。結構體元素層級。使用 StructArray 進行範圍搜尋
在執行元素層級搜尋後,針對每個父實體最多返回一個結果。使用主鍵進行分組搜尋。分組後的實體層級。使用 StructArray 進行分組搜尋
將 StructArray 元素搜尋與另一個向量欄位結合。使用混合搜尋,透過一個 AnnSearchRequest 針對 StructArray 的向量子欄位進行搜尋。元素層級的子搜尋,實體層級的重新排序。結合 StructArray 的混合搜尋

了解兩種搜尋模型

EmbeddingList 搜尋

元素層級搜尋

EmbeddingList 搜尋將 StructArray 向量子欄位內的向量視為父實體的單一嵌入清單。查詢亦為一組嵌入清單。Milvus 會透過MAX_SIM* 指標,將查詢嵌入清單與儲存的嵌入清單進行比對,並回傳符合條件的實體。

  • 查詢資料:嵌入式清單。
  • 度量指標類別:MAX_SIM* 。
  • 結果粒度:實體層級。
  • 最適用於:文件層級或頁面層級的後期互動檢索。

元素層級搜尋將每個 Struct 元素視為獨立的向量搜尋候選項。每個搜尋結果代表 StructArray 欄位內的一個匹配元素,且未分組的結果可顯示該元素的偏移量。

  • 查詢資料:一般向量。
  • 指標家族:常規向量指標。
  • 結果粒度:Struct 元素層級。
  • 最適用於:區塊層級、片段層級或補丁層級的檢索。

警告

若您的集合同時需要 EmbeddingList 搜尋和元素層級搜尋,請使用兩個獨立的向量子欄位。一個向量欄位或向量子欄位僅接受一個索引,且這兩種搜尋模式需要不同的度量族。

文件導覽圖

StructArray 的文件分為「建模」頁面與「搜尋」頁面。請使用建模頁面來定義和準備資料,並使用搜尋頁面來選擇合適的檢索與篩選行為。

範圍頁面用途
建模建立 StructArray 欄位定義結構體(Struct)模式並新增一個 StructArray 欄位。
建模將資料插入 StructArray 欄位準備並插入嵌套的 StructArray 資料。
建模為 StructArray 欄位建立索引在 StructArray 子欄位上建立向量和標量索引。
參考StructArray 限制檢查架構、資料型別、索引、搜尋、篩選及版本限制。
搜尋使用 StructArray 進行基本向量搜尋比較 EmbeddingList 搜尋與元素層級向量搜尋。
搜尋使用 StructArray 進行範圍搜尋在 StructArray 向量子欄位中使用範圍限制。
搜尋使用 StructArray 進行分組搜尋根據主鍵對元素層級的搜尋結果進行分組。
搜尋結合 StructArray 的混合搜尋將 StructArray 元素層級搜尋與其他向量搜尋結合。
搜尋使用 StructArray 進行篩選搜尋在搜尋、查詢及混合搜尋中使用 StructArray 篩選器。
搜尋使用嵌入式清單進行搜尋利用 StructArray 建構 ColBERT 和 ColPali 風格的檢索系統。
篩選StructArray 運算子element_filter 和MATCH_* 運算子的參考語法。

首先應檢查的關鍵限制

  • Struct 可用作 Array 欄位的元素類型,但不能用作頂層集合欄位。

  • 同一 StructArray 字段中的所有 Struct 元素共用一個預定義的架構。

  • 向量子欄位需要索引。EmbeddingList 搜尋使用MAX_SIM* 指標,而元素層級搜尋則使用一般向量指標。

  • element_filter 以及MATCH_* 適用於 StructArray 字段內的標量子字段。請僅在這些運算子內部使用$[subfield] 。

  • 某些搜尋組合受版本限制或僅適用於特定模式。在依賴範圍搜尋、分組搜尋、混合搜尋、可為空欄位或動態新增欄位之前,請先查閱StructArray 限制。

下一步

  1. 若要設計資料結構,請參閱《建立 StructArray 欄位》。

  2. 若要準備資料,請參閱《將資料插入 StructArray 欄位》。

  3. 若要選擇索引,請參閱《為StructArray 欄位建立索引》。

  4. 若要搜尋 StructArray 向量子欄位,請先參閱《StructArray 的基本向量搜尋》。

  5. 若要篩選 StructArray 標量子欄位,請參閱《StructArray 運算子》及《使用 StructArray 進行篩選搜尋》。

翻譯者DeepL

免費嘗試托管的 Milvus

Zilliz Cloud 無縫接入,由 Milvus 提供動力,速度提升 10 倍。

開始使用
反饋

這個頁面有幫助嗎?