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 會透過
|
元素層級搜尋將每個 Struct 元素視為獨立的向量搜尋候選項。每個搜尋結果代表 StructArray 欄位內的一個匹配元素,且未分組的結果可顯示該元素的偏移量。
|
警告
若您的集合同時需要 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 限制。
下一步
若要設計資料結構,請參閱《建立 StructArray 欄位》。
若要準備資料,請參閱《將資料插入 StructArray 欄位》。
若要選擇索引,請參閱《為StructArray 欄位建立索引》。
若要搜尋 StructArray 向量子欄位,請先參閱《StructArray 的基本向量搜尋》。
若要篩選 StructArray 標量子欄位,請參閱《StructArray 運算子》及《使用 StructArray 進行篩選搜尋》。