StructArray フィールドのインデックス作成

ベクトル検索を実行したり、スカラーフィルタリングを高速化したりする前に、StructArray のサブフィールドにインデックスを作成してください。StructArray フィールドの場合、インデックスのターゲットは、chunks[emb_list_vector]chunks[emb]chunks[section] などのサブフィールドパスになります。

このページでは、「StructArray フィールドの作成」のtech_articles コレクションを使用しています。chunks StructArray フィールドには、フィルタリング用のスカラーサブフィールドと、検索用のベクトルサブフィールドが含まれています。

開始する前に

コレクションスキーマに「chunks 」StructArrayフィールドがすでに含まれており、データが挿入されていることを確認してください。

サブフィールドのパスタイプインデックスの目的
chunks[emb_list_vector]FLOAT_VECTORMAX_SIM* メトリクスを使用した EmbeddingList 検索。
chunks[emb]FLOAT_VECTOR通常のベクトルメトリックを使用した要素レベルの検索。
chunks[section]VARCHARカテゴリフィルタリング。
chunks[quality_score]FLOAT数値フィルタリングおよび範囲指定型の述語。
chunks[has_code]BOOLブールフィルタリング。

ベクトルフィールドまたはベクトルサブフィールドは、1 つのインデックスのみを受け入れます。EmbeddingList 検索と要素レベルの検索の両方が必要な場合は、2 つの別々のベクトルサブフィールドを作成し、それぞれ個別にインデックスを作成してください。このページでは、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]ターゲットでサポートされているスカラーインデックス。

EmbeddingList 検索は、StructArray のベクトルサブフィールド内のベクトルを埋め込みリストとして扱い、エンティティレベルの結果を返します。要素レベルの検索は、各 Struct 要素を個別に検索し、一致した要素のオフセットを返すことができます。

ベクトルインデックスの作成

次の例では、2つのベクトルインデックスを作成します。1つ目のインデックスは、EmbeddingList検索用にMAX_SIM* メトリックを使用します。2つ目のインデックスは、要素レベル検索用に通常のベクトルメトリックを使用します。

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* インデックスと通常のベクトルメトリックインデックスを同時に作成しないでください。両方の検索モードが必要な場合は、ベクトルを2つの別々のベクトルサブフィールドに書き込み、各サブフィールドに対して1つずつインデックスを作成してください。

スカラーインデックスの作成

フィルタで 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,
)

スカラーインデックスはオプションですが、element_filter(chunks, $[quality_score] > 0.9)MATCH_ANY(chunks, $[section] == "index") などのフィルターでStructArrayのスカラーサブフィールドが頻繁に現れる場合には有用です。

インデックスとメトリックの互換性

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]` とし、`emb ` や `chunks.emb` とはしないでください。
1 つのベクトルサブフィールドには 1 つのインデックスしか指定できません。異なるメトリックファミリーが必要な場合は、別々のベクトルサブフィールドを使用してください。
EmbeddingList 検索には、MAX_SIM* メトリクスを使用してください。EmbeddingList クエリデータには、MAX_SIM* メトリックを使用して構築されたインデックスが必要です。
要素レベルの検索には、通常のベクトルメトリクスを使用してください。要素レベルの検索では、通常のベクトルクエリデータと、COSINEIPL2 などのメトリックが使用されます。
フィルタに現れるスカラーサブフィールドをインデックス化してください。ターゲットでサポートされているスカラーインデックス型を使用してください。
ベクトルフィールドの制限に注意してください。ベクトルフィールドとベクトルサブフィールドの合計数には制限があります。多数のベクトルサブフィールドを追加する前に、「StructArray の制限」を参照してください。

よくある間違い

  • chunks[emb] ではなく、chunks.emb にインデックスを作成してしまう。

  • MAX_SIM* インデックスのみを作成し、その同じサブフィールドに対して要素レベルの検索を実行しようとする。

  • 通常のベクトルインデックスのみを作成し、その後、同じサブフィールドで EmbeddingList 検索を実行しようとする。

  • 1つのベクトルサブフィールドを、MAX_SIM* メトリクスと通常のベクトルメトリクスの両方で再利用すること。

  • 頻繁に使用される StructArray フィルター用のスカラーインデックスを作成し忘れる。

  • Structスキーマに存在しないStructArrayサブフィールドにインデックスを付与している。

次の手順

  1. エンティティレベルの EmbeddingList 検索または要素レベルのベクトル検索を実行するには、「StructArray を使用した基本的なベクトル検索」を参照してください。

  2. 検索時に StructArray のスカラーサブフィールドをフィルタリングするには、「StructArray を使用したフィルタ検索」を参照してください。

  3. インデックスおよびメトリックの制限を確認するには、「StructArrayの制限」を参照してください。