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

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

パーティションキーは、パーティションに基づく検索最適化ソリューションです。特定のスカラー フィールドをパーティションキーとして指定し、検索時にパーティションキーに基づくフィルタリング条件を設定することで、検索範囲をいくつかのパーティションに絞り込むことができ、検索効率が向上します。この記事では、パーティションキーの使用方法と関連する注意点を紹介します。

概要

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

Zilliz Cloud では、コレクション内で作成可能なパーティション数の制限を克服するために、データ分離におけるパーティションの再利用を可能にする「パーティションキー」を導入しています。コレクション作成時に、スカラー フィールドをパーティションキーとして指定できます。コレクションの準備が完了すると、Zilliz Cloud はコレクション内に指定された数のパーティションを自動的に作成します。エンティティの挿入を受信すると、Zilliz Cloud はそのエンティティのパーティションキー値からハッシュ値を計算し、そのハッシュ値とコレクションの partitions_num プロパティに基づいて剰余演算(modulo)を実行して対象パーティション ID を取得し、そのエンティティを対象パーティションに格納します。

IXXIwZdOYhRFXmbTMdwcaN6fnPe

以下の図は、パーティションキー機能を有効にした場合と無効にした場合で、Zilliz Cloud がコレクション内の検索リクエストをどのように処理するかを示しています。

  • パーティションキーが無効の場合、Zilliz Cloud はコレクション内でクエリベクトルに最も類似するエンティティを検索します。どのパーティションに最も関連性の高い結果が含まれているかが事前に分かっている場合は、検索範囲を絞り込むことができます。

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

RTaqwdaWXhRWPTb4uJTc9Uknn5c

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

パーティションキーを使用するには、以下の操作が必要です。

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

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

📘Notes

スカラー フィールドをパーティションキーとして設定する場合、フィールド値を空または 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)

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

Set Partition Numbers

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

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

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

フィルタリング条件の作成

パーティションキー機能が有効化されたコレクションでANN検索を実行する際には、検索リクエストにパーティションキーを含むフィルタリング式を指定する必要があります。このフィルタリング式では、パーティションキーの値を特定の範囲内に限定することで、Zilliz Cloudが対応するパーティション内でのみ検索を実行します。

削除操作を実行する際には、単一のパーティションキーを指定するフィルター式を含めることを推奨します。これにより、削除操作が特定のパーティションに限定され、コンパクション時のライトアンプリフィケーションが軽減され、コンパクションおよびインデックス作成のためのリソースを節約できます。

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

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

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

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

Use パーティションキー Isolation

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

BVotwv5BvhBWXXbvotUccowZnng

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

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

Enable パーティションキー Isolation

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

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

パーティションキー分離を有効にした後でも、パーティション数の設定で説明されているように、パーティションキーとパーティション数を設定できます。ただし、パーティションキーに基づくフィルターには、特定のパーティションキー値を1つだけ含める必要があります。