為 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]常規向量度量族,例如COSINEIPL2
依字串或類別篩選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 搜尋使用MAX_SIM* 指標。它將 StructArray 向量子欄位中的向量視為嵌入清單,並返回實體層級的結果。

向量子欄位資料型別索引類型度量類型
FLOAT_VECTOR,FLOAT16_VECTOR,BFLOAT16_VECTORIVF_FLAT,IVF_FLAT_CC,HNSW,HNSW_SQ,HNSW_PQ,HNSW_PRQ,DISKANNMAX_SIM,MAX_SIM_COSINE,MAX_SIM_IP,MAX_SIM_L2
INT8_VECTORHNSW,HNSW_SQ,HNSW_PQ,HNSW_PRQMAX_SIM,MAX_SIM_COSINE,MAX_SIM_IP,MAX_SIM_L2
BINARY_VECTORHNSWMAX_SIM_HAMMING,MAX_SIM_JACCARD

元素層級搜尋採用標準向量度量。它會獨立搜尋每個 Struct 元素,並可回傳匹配元素的偏移量。

向量子欄位資料型別索引類型度量類型
FLOAT_VECTOR,FLOAT16_VECTOR,BFLOAT16_VECTORFLAT,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,DISKANNL2,IP,COSINE
INT8_VECTORHNSW,HNSW_SQ,HNSW_PQ,HNSW_PRQL2,IP,COSINE
BINARY_VECTORHNSWHAMMING,JACCARD
BINARY_VECTORBIN_FLATHAMMING,JACCARD,SUBSTRUCTURE,SUPERSTRUCTURE,MHJACCARD
BINARY_VECTORBIN_IVF_FLATHAMMING,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] 來建立索引,而非embchunks.emb
一個向量子欄位僅接受一個索引。若需使用不同的指標家族,請使用獨立的向量子欄位。
請使用MAX_SIM* 指標進行 EmbeddingList 搜尋。EmbeddingList 查詢資料需要使用MAX_SIM* 指標建立的索引。
請使用一般向量指標進行元素層級搜尋。元素層級搜尋使用一般向量查詢資料,以及諸如COSINEIPL2 等指標。
請為出現在篩選條件中的標量子欄位建立索引。請使用目標所支援的標量索引類型。
請留意向量欄位的限制。向量場和向量子場的總數受到限制。在新增大量向量子場之前,請參閱《StructArray 限制》。

常見錯誤

  • 在 `chunks.emb ` 上建立索引,而非在 `chunks[emb]` 上建立索引。

  • 僅建立MAX_SIM* 索引,隨後卻嘗試在同一子場上執行元素層級搜尋。

  • 僅建立一般向量索引,隨後卻嘗試在同一子場上執行 EmbeddingList 搜尋。

  • 將同一個向量子欄位同時用於MAX_SIM* 和一般向量指標。

  • 遺漏針對使用頻率極高的 StructArray 篩選條件所建立的標量索引。

  • 為 Struct 模式中不存在的 StructArray 子欄位建立索引。

下一步

  1. 若要執行實體層級的 EmbeddingList 搜尋或元素層級的向量搜尋,請參閱《使用 StructArray 進行基本向量搜尋》。

  2. 若要在搜尋過程中篩選 StructArray 的標量子欄位,請參閱《使用 StructArray 進行篩選搜尋》。

  3. 若要檢視索引和指標限制,請參閱《StructArray 限制》

翻譯者DeepL

免費嘗試托管的 Milvus

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

開始使用
反饋

這個頁面有幫助嗎?