為 StructArray 欄位建立索引
在執行向量搜尋或加速標量篩選之前,請先在 StructArray 子欄位上建立索引。對於 StructArray 欄位,索引目標為子欄位路徑,例如chunks[emb_list_vector] 、chunks[emb] 或chunks[section] 。
本頁使用《建立 StructArray 欄位》中的tech_articles 集合。chunks StructArray 欄位包含用於篩選的標量子欄位,以及用於搜尋的向量子欄位。
開始之前
請確保集合模式中已包含chunks StructArray 欄位,且資料已插入。
| 子欄位路徑 | 類型 | 索引用途 |
|---|---|---|
chunks[emb_list_vector] | FLOAT_VECTOR | 使用MAX_SIM* 指標進行 EmbeddingList 搜尋。 |
chunks[emb] | FLOAT_VECTOR | 使用常規向量指標進行元素層級搜尋。 |
chunks[section] | VARCHAR | 類別篩選。 |
chunks[quality_score] | FLOAT | 數值篩選與範圍式謂詞。 |
chunks[has_code] | BOOL | 布林篩選。 |
向量欄位或向量子欄位僅接受一個索引。若您同時需要 EmbeddingList 搜尋與元素層級搜尋,請建立兩個獨立的向量子欄位,並分別為其建立索引。在此頁面中,chunks[emb_list_vector] 已建立索引以供 EmbeddingList 搜尋使用,而chunks[emb] 則已建立索引以供元素層級搜尋使用。
選擇索引
請使用搜尋模式來選擇向量度量家族。
| 搜尋或篩選目標 | 目標路徑 | 應如何選擇 |
|---|---|---|
| EmbeddingList 搜尋 | chunks[emb_list_vector] | MAX_SIM* 度量族。 |
| 元素層級向量搜尋 | chunks[emb] | 常規向量度量族,例如COSINE 、IP 或L2 。 |
| 依字串或類別篩選 | chunks[section] | 您的目標所支援的標量索引。 |
| 依數值範圍篩選 | chunks[quality_score],chunks[page] | 目標所支援的標量索引。 |
| 依布林值篩選 | chunks[has_code] | 您的目標所支援的標量索引。 |
「嵌入清單」搜尋會將 StructArray 向量子欄位中的向量視為嵌入清單,並回傳實體層級的結果。元素層級搜尋則會獨立搜尋每個 Struct 元素,並可回傳匹配元素的偏移量。
建立向量索引
以下範例建立兩個向量索引。第一個索引使用「MAX_SIM* 」度量進行 EmbeddingList 搜尋;第二個索引則使用一般向量度量進行元素層級搜尋。
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
)
index_params = client.prepare_index_params()
# Index for EmbeddingList search.
index_params.add_index(
field_name="chunks[emb_list_vector]",
index_name="chunks_emb_list_max_sim",
index_type="HNSW",
metric_type="MAX_SIM_COSINE",
params={
"M": 16,
"efConstruction": 200,
},
)
# Index for element-level search.
index_params.add_index(
field_name="chunks[emb]",
index_name="chunks_emb_cosine",
index_type="HNSW",
metric_type="COSINE",
params={
"M": 16,
"efConstruction": 200,
},
)
client.create_index(
collection_name="tech_articles",
index_params=index_params,
)
警告
請勿在同一個向量子字段上建立「MAX_SIM* 」索引與一般向量度量索引。若需同時使用這兩種搜尋模式,請將向量寫入兩個獨立的向量子字段,並分別針對每個子字段建立一個索引。
建立標量索引
當您在篩選器中使用 StructArray 標量子欄位時,請為其建立標量索引。請使用與structArray[subfield] 相同的路徑語法。
index_params = client.prepare_index_params()
index_params.add_index(
field_name="chunks[section]",
index_name="chunks_section_inverted",
index_type="INVERTED",
)
index_params.add_index(
field_name="chunks[has_code]",
index_name="chunks_has_code_inverted",
index_type="INVERTED",
)
index_params.add_index(
field_name="chunks[quality_score]",
index_name="chunks_quality_score_sort",
index_type="STL_SORT",
)
index_params.add_index(
field_name="chunks[page]",
index_name="chunks_page_sort",
index_type="STL_SORT",
)
client.create_index(
collection_name="tech_articles",
index_params=index_params,
)
標量索引雖屬選用,但在 StructArray 標量子場頻繁出現在篩選器中時(例如element_filter(chunks, $[quality_score] > 0.9) 或MATCH_ANY(chunks, $[section] == "index") ),此功能相當實用。
索引指標的相容性
請參照以下表格,為 StructArray 向量子欄位選擇索引類型與度量類型。請從目標開始,然後根據搜尋模式選擇度量家族。
請從以下相容性表格中選擇 Milvus 索引類型與度量類型。
EmbeddingList 搜尋
EmbeddingList 搜尋使用MAX_SIM* 指標。它將 StructArray 向量子欄位中的向量視為嵌入清單,並返回實體層級的結果。
| 向量子欄位資料型別 | 索引類型 | 度量類型 |
|---|---|---|
FLOAT_VECTOR,FLOAT16_VECTOR,BFLOAT16_VECTOR | IVF_FLAT,IVF_FLAT_CC,HNSW,HNSW_SQ,HNSW_PQ,HNSW_PRQ,DISKANN | MAX_SIM,MAX_SIM_COSINE,MAX_SIM_IP,MAX_SIM_L2 |
INT8_VECTOR | HNSW,HNSW_SQ,HNSW_PQ,HNSW_PRQ | MAX_SIM,MAX_SIM_COSINE,MAX_SIM_IP,MAX_SIM_L2 |
BINARY_VECTOR | HNSW | MAX_SIM_HAMMING,MAX_SIM_JACCARD |
元素層級搜尋
元素層級搜尋採用標準向量度量。它會獨立搜尋每個 Struct 元素,並可回傳匹配元素的偏移量。
| 向量子欄位資料型別 | 索引類型 | 度量類型 |
|---|---|---|
FLOAT_VECTOR,FLOAT16_VECTOR,BFLOAT16_VECTOR | FLAT,IVF_FLAT,IVF_FLAT_CC,IVF_SQ8,IVF_SQ_CC,IVF_PQ,SCANN,IVF_RABITQ,IVF_RABITQ_FASTSCAN,HNSW,HNSW_SQ,HNSW_PQ,HNSW_PRQ,DISKANN | L2,IP,COSINE |
INT8_VECTOR | HNSW,HNSW_SQ,HNSW_PQ,HNSW_PRQ | L2,IP,COSINE |
BINARY_VECTOR | HNSW | HAMMING,JACCARD |
BINARY_VECTOR | BIN_FLAT | HAMMING,JACCARD,SUBSTRUCTURE,SUPERSTRUCTURE,MHJACCARD |
BINARY_VECTOR | BIN_IVF_FLAT | HAMMING,JACCARD |
有關特定版本的支援及其他限制,請參閱《StructArray 限制》。
驗證索引
建立索引後,請描述集合或清單索引,以確認預期的子欄位路徑已納入索引。
indexes = client.list_indexes(
collection_name="tech_articles",
)
print(indexes)
若您的 SDK 版本提供了索引描述 API,您亦可對特定索引進行描述。
index = client.describe_index(
collection_name="tech_articles",
index_name="chunks_emb_cosine",
)
print(index)
索引規則
| 規則 | 說明 |
|---|---|
| 請使用路徑語法來建立子欄位索引。 | 請使用chunks[emb] 來建立索引,而非emb 或chunks.emb 。 |
| 一個向量子欄位僅接受一個索引。 | 若需使用不同的指標家族,請使用獨立的向量子欄位。 |
請使用MAX_SIM* 指標進行 EmbeddingList 搜尋。 | EmbeddingList 查詢資料需要使用MAX_SIM* 指標建立的索引。 |
| 請使用一般向量指標進行元素層級搜尋。 | 元素層級搜尋使用一般向量查詢資料,以及諸如COSINE 、IP 或L2 等指標。 |
| 請為出現在篩選條件中的標量子欄位建立索引。 | 請使用目標所支援的標量索引類型。 |
| 請留意向量欄位的限制。 | 向量場和向量子場的總數受到限制。在新增大量向量子場之前,請參閱《StructArray 限制》。 |
常見錯誤
在 `
chunks.emb` 上建立索引,而非在 `chunks[emb]` 上建立索引。僅建立
MAX_SIM*索引,隨後卻嘗試在同一子場上執行元素層級搜尋。僅建立一般向量索引,隨後卻嘗試在同一子場上執行 EmbeddingList 搜尋。
將同一個向量子欄位同時用於
MAX_SIM*和一般向量指標。遺漏針對使用頻率極高的 StructArray 篩選條件所建立的標量索引。
為 Struct 模式中不存在的 StructArray 子欄位建立索引。
下一步
若要執行實體層級的 EmbeddingList 搜尋或元素層級的向量搜尋,請參閱《使用 StructArray 進行基本向量搜尋》。
若要在搜尋過程中篩選 StructArray 的標量子欄位,請參閱《使用 StructArray 進行篩選搜尋》。
若要檢視索引和指標限制,請參閱《StructArray 限制》。