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

Partition Key を使用する

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

概要​

Zilliz Cloud では、パーティションを使用してデータ分離を実装し、検索範囲を特定のパーティションに制限することで検索パフォーマンスを向上できます。パーティションを手動で管理する場合、1 つのコレクションに最大 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 は対応するパーティション内に検索範囲を制限します。

削除操作を実行する場合は、より効率的な削除を実現するために、単一のパーティションキーを指定するフィルター式を含めることをお勧めします。このアプローチでは削除操作が特定のパーティションに限定されるため、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 Isolation を使用する​

マルチテナンシーのシナリオでは、テナントの識別情報に関連するスカラーフィールドをパーティションキーとして指定し、このスカラーフィールド内の特定の値に基づくフィルターを作成できます。同様のシナリオで検索パフォーマンスをさらに向上させるために、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 つだけ含まれている必要があることに注意してください。