メインコンテンツまでスキップ

Partition Key を使用する

Partition Key は、コレクションの名前空間として機能し、論理的なデータ分離を実現する検索最適化ソリューションです。テナント ID やプロジェクト名などの特定のスカラーフィールドを Partition Key に指定すると、単一のコレクション内でデータを複数の名前空間に効果的に分割できます。これにより、フィルター条件を使用して検索リクエストを特定の名前空間に限定できるため、検索範囲を大幅に狭め、全体的な効率を向上できます。この記事では、この名前空間ベースの最適化を実装する方法と、Partition Key を使用する際の考慮事項について説明します。

概要​

Zilliz Cloud では、パーティションを使用してデータ分離を実装し、検索範囲を特定のパーティションに制限することで検索パフォーマンスを向上できます。パーティションを手動で管理する場合、コレクション内に最大 1,024 個のパーティションを作成し、特定のルールに基づいてエンティティをこれらのパーティションに挿入することで、特定の数のパーティション内に検索を制限して検索範囲を狭めることができます。

Zilliz Cloud では、コレクション内に作成できるパーティション数の制限を克服するために、データ分離でパーティションを再利用できる Partition Key を提供しています。コレクションを作成する際、スカラーフィールドを Partition Key として使用できます。コレクションの準備が完了すると、Zilliz Cloud はコレクション内に指定された数のパーティションを作成します。挿入されたエンティティを受信すると、Zilliz Cloud はエンティティの Partition Key 値を使用してハッシュ値を計算し、そのハッシュ値とコレクションの partitions_num プロパティに基づいて剰余演算を実行して対象のパーティション ID を取得し、エンティティを対象のパーティションに保存します。

IXXIwZdOYhRFXmbTMdwcaN6fnPe

次の図は、Partition Key 機能が有効なコレクションと無効なコレクションで、Zilliz Cloud が検索リクエストを処理する方法を示しています。

  • Partition Key が無効な場合、Zilliz Cloud はコレクション内でクエリベクトルに最も類似するエンティティを検索します。最も関連性の高い結果を含むパーティションがわかっている場合は、検索範囲を狭めることができます。

  • Partition Key が有効な場合、Zilliz Cloud は検索フィルターで指定された Partition Key 値に基づいて検索範囲を決定し、一致するパーティション内のエンティティのみをスキャンします。

RTaqwdaWXhRWPTb4uJTc9Uknn5c

Partition Key を使用する​

Partition Key を使用するには、次の手順を実行します。

Partition Key を設定する​

スカラーフィールドを Partition Key として指定するには、スカラーフィールドを追加するときに、その is_partition_key 属性を true に設定する必要があります。

Notes

スカラーフィールドを Partition Key に設定した場合、フィールドの値は空または null にできません。

python
from pymilvus import (
MilvusClient, DataType
)

client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

schema = client.create_schema()

schema.add_field(field_name="id",
datatype=DataType.INT64,
is_primary=True)

schema.add_field(field_name="vector",
datatype=DataType.FLOAT_VECTOR,
dim=5)

# Add the partition key
schema.add_field(
field_name="my_varchar",
datatype=DataType.VARCHAR,
max_length=512,
is_partition_key=True,
)

パーティション数を設定する​

コレクション内のスカラーフィールドを Partition Key に指定すると、Zilliz Cloud はコレクション内に 16 個のパーティションを自動的に作成します。エンティティを受信すると、Zilliz Cloud はそのエンティティの Partition Key 値に基づいてパーティションを選択し、エンティティをそのパーティションに保存します。その結果、一部またはすべてのパーティションに、異なる Partition Key 値を持つエンティティが格納されます。

コレクションの作成時に、作成するパーティション数を決定することもできます。これは、Partition Key として指定されたスカラーフィールドがある場合にのみ有効です。

python
client.create_collection(
collection_name="my_collection",
schema=schema,
num_partitions=128
)

フィルター条件を作成する​

Partition Key 機能が有効なコレクションで ANN 検索を実行する場合、検索リクエストに Partition Key を含むフィルター式を含める必要があります。フィルター式で Partition Key 値を特定の範囲に制限すると、Zilliz Cloud は対応するパーティション内に検索範囲を制限します。

削除操作を実行する場合は、より効率的な削除を実現するために、単一の Partition Key を指定するフィルター式を含めることをお勧めします。この方法では、削除操作が特定のパーティションに限定されるため、Compaction 中の書き込み増幅が抑制され、Compaction とインデックス作成のためのリソースが節約されます。

次の例では、特定の Partition Key 値と複数の Partition Key 値に基づく、Partition Key ベースのフィルタリングを示します。

python
# Filter based on a single partition key value, or
filter='my_varchar == "x" && <other conditions>'

# Filter based on multiple partition key values
filter='my_varchar in ["x", "y", "z"] && <other conditions>'
Notes

partition_key は、Partition Key として指定されたフィールドの名前に置き換える必要があります。

Partition Key Isolation を使用する​

マルチテナンシーのシナリオでは、テナントの識別情報に関連するスカラーフィールドを Partition Key に指定し、このスカラーフィールドの特定の値に基づくフィルターを作成できます。同様のシナリオで検索パフォーマンスをさらに向上させるために、Zilliz Cloud は Partition Key Isolation 機能を提供しています。

BVotwv5BvhBWXXbvotUccowZnng

上の図に示すように、Zilliz Cloud は Partition Key 値に基づいてエンティティをグループ化し、各グループに個別のインデックスを作成します。検索リクエストを受信すると、Zilliz Cloud はフィルター条件で指定された Partition Key 値に基づいてインデックスを特定し、そのインデックスに含まれるエンティティ内に検索範囲を制限します。これにより、検索中に関係のないエンティティをスキャンすることを回避し、検索パフォーマンスを大幅に向上させます。

Partition Key Isolation を有効にした後は、Zilliz Cloud が一致するインデックスに含まれるエンティティ内に検索範囲を制限できるように、Partition Key ベースのフィルターに特定の値を 1 つだけ含める必要があります。

Partition Key Isolation を有効にする​

次のコード例は、Partition Key Isolation を有効にする方法を示しています。

python
client.create_collection(
collection_name="my_collection",
schema=schema,
properties={"partitionkey.isolation": True}
)

Partition Key Isolation を有効にした後も、パーティション数を設定するで説明されているように Partition Key とパーティション数を設定できます。Partition Key ベースのフィルターには、特定の Partition Key 値を 1 つだけ含める必要があることに注意してください。