JSONインデックス
JSONフィールドは、Zilliz Cloudに構造化メタデータを柔軟に保存する方法を提供します。インデックスがない場合、JSONフィールドのクエリにはコレクション全体をスキャンする必要があり、データセットが大きくなるにつれて遅くなります。JSONインデックスは、JSONデータ内の値にインデックスを作成することで高速ルックアップを可能にします。
JSONインデックスは以下に最適です:
-
一貫した既知のキーを持つ構造化スキーマ
-
特定のJSONパスの等価および範囲クエリ
-
インデックス対象のキーを正確に制御する必要があるシナリオ
-
ターゲットクエリを効率的に高速化するためのストレージ効率
複雑なJSONドキュメントと多様なクエリパターンには、代替としてJSON Shreddingを検討してください。
JSONインデックス構文
JSONインデックスを作成する際には、以下の項目を指定します:
-
JSONパス: インデックス対象のデータの正確な場所
-
データキャスト型: 値の解釈方法と保存方法
-
オプションの型変換: 必要に応じてインデックス作成時のデータ変換
JSONフィールドにインデックスを作成する構文は以下の通りです:
# インデックスパラメータを準備
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="<json_field_name>", # JSONフィールド名
index_type="AUTOINDEX", # AUTOINDEXに設定する必要があります
index_name="<unique_index_name>", # インデックス名
params={
"json_path": "<path_to_json_key>", # JSONデータ内でのインデックス対象キーのパス
"json_cast_type": "<data_type>", # 値を解釈およびインデックス化するときに使用するデータ型
# "json_cast_function": "<cast_function>" # オプション:インデックス作成時にキー値をターゲット型に変換
}
)
パラメータ | 説明 | 値/例 |
|---|---|---|
| コレクションスキーマ内のJSONフィールド名です。 |
|
| JSONインデックスでは |
|
| このインデックスのユニーク識別子です。 |
|
| JSONオブジェクト内でインデックス対象のキーへのパスです。 |
|
| 値を解釈およびインデックス化するときに使用するデータ型。キーの実際のデータ型と一致する必要があります。 使用可能なキャスト型のリストについては、サポートされているキャスト型以下を参照してください。 |
|
| (オプション) インデックス作成時に元のキー値をターゲット型に変換します。この構成は、キー値が誤った形式で保存されており、インデックス作成時にデータ型を変換したい場合にのみ必要です。 使用可能なキャスト関数のリストについては、サポートされているキャスト関数以下を参照してください。 |
|
サポートされているキャスト型
Zilliz Cloudは、インデックス作成時のキャストに以下のデータ型をサポートしています。これらの型により、データが効率的なフィルタリング用に正しく解釈されることを保証します。
キャスト型 | 説明 | JSON値の例 |
|---|---|---|
| 真偽値をインデックス化するために使用され、true/false条件のクエリを可能にします。 |
|
| 数値(整数と浮動小数点数の両方)用に使用されます。範囲や等価性に基づくフィルタリング(例: |
|
| 文字列値をインデックス化するために使用され、名前やカテゴリ、IDなどのテキストベースのデータに一般的です。 |
|
| 真偽値の配列をインデックス化するために使用されます。 |
|
| 数値の配列をインデックス化するために使用されます。 |
|
| 文字列の配列をインデックス化するために使用されます。タグやキーワードのリストに理想的です。 |
|
| 自動型推論とフラット化による完全なJSONオブジェクトまたはサブオブジェクト。 完全なJSONオブジェクトにインデックスを作成すると、インデックスサイズが大きくなります。多キーのシナリオでは、JSON Shreddingを検討してください。 | 任意のJSONオブジェクト |
最適なインデックス作成のために配列には同じ型の要素を含める必要があります。詳細はArray Fieldを参照してください。
サポートされているキャスト関数
JSONフィールドキーに誤った形式の値が含まれている場合(例:文字列として保存された数値)、json_cast_function引数にキャスト関数を渡してインデックス作成時にこれらの値を変換できます。
キャスト関数は大文字小文字を区別しません。以下の関数がサポートされています:
キャスト関数 | 変換元 → 変換先 | 使用例 |
|---|---|---|
| 文字列 → 数値(double) |
|
変換に失敗した場合(例:数値でない文字列)、値はスキップされ、インデックスに含まれません。
JSONインデックスを作成
このセクションでは、実践的な例を使用して異なる種類のJSONデータにインデックスを作成する方法を示します。すべての例では、以下に示すサンプルJSON構造を使用し、適切に定義されたコレクションスキーマを持つMilvusClientへの接続がすでに確立されていると想定しています。
サンプルJSON構造
{
"metadata": {
"category": "electronics",
"brand": "BrandA",
"in_stock": true,
"price": 99.99,
"string_price": "99.99",
"tags": ["clearance", "summer_sale"],
"supplier": {
"name": "SupplierX",
"country": "USA",
"contact": {
"email": "support@supplierx.com",
"phone": "+1-800-555-0199"
}
}
}
}
基本的なセットアップ
JSONインデックスを作成する前に、インデックスパラメータを準備します:
# インデックスパラメータを準備
index_params = MilvusClient.prepare_index_params()
例1: 単純なJSONキーにインデックスを作成
製品カテゴリによる高速フィルタリングを可能にするためにcategoryフィールドにインデックスを作成します:
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX", # JSONパスインデックス作成ではAUTOINDEXに設定する必要があります
index_name="category_index", # ユニークなインデックス名
params={
"json_path": 'metadata["category"]', # JSONキーへのパス
"json_cast_type": "varchar" # データキャスト型
}
)