メインコンテンツまでスキップ
バージョン: User Guides (BYOC)

パーティションキーの使用

パーティションキーは、パーティションに基づく検索最適化ソリューションです。特定のスカラーフィールドをパーティションキーとして指定し、検索中にパーティションキーに基づくフィルター条件を指定することにより、検索範囲をいくつかのパーティションに限定し、検索効率を向上させることができます。この記事では、パーティションキーの使用方法と関連する考慮事項について紹介します。

概要

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

Zilliz Cloudでは、パーティションキーを使用して、データ分離におけるパーティションを再利用して、コレクションで作成できるパーティション数の上限を克服できます。コレクション作成時に、スカラーフィールドをパーティションキーとして使用できます。コレクションの準備ができると、Zilliz Cloudはコレクション内に指定された数のパーティションを作成します。挿入されたエンティティを受信すると、Zilliz Cloudはエンティティのパーティションキー値を使用してハッシュ値を計算し、ハッシュ値とコレクションのpartitions_numプロパティに基づいてモジュロ演算を実行して対象のパーティションIDを取得し、エンティティを対象のパーティションに格納します。

IXXIwZdOYhRFXmbTMdwcaN6fnPe

以下の図は、Zilliz Cloudがパーティションキーフィーチャーが有効なコレクションと無効なコレクションで検索要求を処理する方法を示しています。

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

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

RTaqwdaWXhRWPTb4uJTc9Uknn5c

パーティションキーの使用

パーティションキーを使用するには、

パーティションキーの設定

特定のスカラーフィールドをパーティションキーとして指定するには、スカラーフィールドを追加する際にそのis_partition_key属性をtrueに設定する必要があります。

📘注釈

スカラーフィールドをパーティションキーとして設定する際、フィールド値を空にしたりNULLにしたりすることはできません。

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)

# パーティションキーを追加
schema.add_field(
field_name="my_varchar",
datatype=DataType.VARCHAR,
max_length=512,
is_partition_key=True,
)

パーティション数の設定

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

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

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

フィルター条件の作成

パーティションキーフィーチャーが有効なコレクションでANN検索を実行する際には、検索リクエストにパーティションキーを含んだフィルター式を含める必要があります。フィルター式では、パーティションキー値を特定の範囲内に制限することで、Zilliz Cloudが検索範囲を対応するパーティション内に限定できます。

削除操作を実行する際には、パーティションキーを1つ指定するフィルター式を含めることで、より効率的な削除を実現することをお勧めします。この方法により、削除操作は特定のパーティションに限定され、コンパクション中の書き込み増幅を減らし、コンパクションおよびインデックス作成のためのリソースを節約できます。

以下の例では、特定のパーティションキー値およびパーティションキーセットに基づくパーティションキーによるフィルタリングを示しています。

# 単一のパーティションキー値に基づくフィルター、または
filter='partition_key == "x" && <other conditions>'

# 複数のパーティションキー値に基づくフィルター
filter='partition_key in ["x", "y", "z"] && <other conditions>'
📘注釈

partition_keyをパーティションキーとして指定されたフィールドの名前に置き換える必要があります。

パーティションキーアイソレーションの使用

マルチテナンシーのシナリオでは、テナントIDに関連するスカラーフィールドをパーティションキーとして指定し、このスカラーフィールドの特定の値に基づくフィルターを作成できます。同様のシナリオでの検索パフォーマンスをさらに向上させるために、Zilliz Cloudはパーティションキーアイソレーション機能を導入しています。

BVotwv5BvhBWXXbvotUccowZnng

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

パーティションキーアイソレーションを有効にすると、パーティションキーに基づくフィルターには1つの特定の値のみを含める必要があり、Zilliz Cloudが検索範囲を一致するインデックスに含まれるエンティティ内に限定できるようになります。

パーティションキーアイソレーションの有効化

以下のコード例は、パーティションキーアイソレーションを有効にする方法を示しています。

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

パーティションキーアイソレーションを有効にすると、パーティション数の設定で説明したように、パーティションキーとパーティション数を設定できます。パーティションキーに基づくフィルターは、単一の特定のパーティションキー値のみを含むべきであることに注意してください。