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 | ブールフィルタリング。 |
ベクトルフィールドまたはベクトルサブフィールドは、1 つのインデックスのみを受け入れます。EmbeddingList 検索と要素レベルの検索の両方が必要な場合は、2 つの別々のベクトルサブフィールドを作成し、それぞれ個別にインデックスを作成してください。このページでは、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] | ターゲットでサポートされているスカラーインデックス。 |
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 検索
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` とはしないでください。 |
| 1 つのベクトルサブフィールドには 1 つのインデックスしか指定できません。 | 異なるメトリックファミリーが必要な場合は、別々のベクトルサブフィールドを使用してください。 |
EmbeddingList 検索には、MAX_SIM* メトリクスを使用してください。 | EmbeddingList クエリデータには、MAX_SIM* メトリックを使用して構築されたインデックスが必要です。 |
| 要素レベルの検索には、通常のベクトルメトリクスを使用してください。 | 要素レベルの検索では、通常のベクトルクエリデータと、COSINE 、IP 、L2 などのメトリックが使用されます。 |
| フィルタに現れるスカラーサブフィールドをインデックス化してください。 | ターゲットでサポートされているスカラーインデックス型を使用してください。 |
| ベクトルフィールドの制限に注意してください。 | ベクトルフィールドとベクトルサブフィールドの合計数には制限があります。多数のベクトルサブフィールドを追加する前に、「StructArray の制限」を参照してください。 |
よくある間違い
chunks[emb]ではなく、chunks.embにインデックスを作成してしまう。MAX_SIM*インデックスのみを作成し、その同じサブフィールドに対して要素レベルの検索を実行しようとする。通常のベクトルインデックスのみを作成し、その後、同じサブフィールドで EmbeddingList 検索を実行しようとする。
1つのベクトルサブフィールドを、
MAX_SIM*メトリクスと通常のベクトルメトリクスの両方で再利用すること。頻繁に使用される StructArray フィルター用のスカラーインデックスを作成し忘れる。
Structスキーマに存在しないStructArrayサブフィールドにインデックスを付与している。
次の手順
エンティティレベルの EmbeddingList 検索または要素レベルのベクトル検索を実行するには、「StructArray を使用した基本的なベクトル検索」を参照してください。
検索時に StructArray のスカラーサブフィールドをフィルタリングするには、「StructArray を使用したフィルタ検索」を参照してください。
インデックスおよびメトリックの制限を確認するには、「StructArrayの制限」を参照してください。