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

配列フィールド

配列フィールドは、同じデータ型の要素の順序付きセットを保存します。

以下は、配列フィールドがデータをどのように保存するかの例です:

{
"tags": ["pop", "rock", "classic"],
"ratings": [5, 4, 3]
}

制限事項

  • デフォルト値: 配列フィールドはデフォルト値をサポートしていません。ただし、nullable属性をTrueに設定してnull値を許可できます。詳細については、Nullable & Defaultを参照してください。

  • データ型: 配列フィールド内のすべての要素は同じデータ型を共有する必要があります。これはelement_typeパラメータによって定義されます。element_typeVARCHARに設定されている場合、配列要素のmax_lengthも指定する必要があります。element_typeには任意のスカラーデータ型、JSON、およびSTRUCTが使用できます。

  • 配列容量: 配列フィールド内の要素数は、配列作成時に定義された最大容量(max_capacityで指定)以下である必要があります。値は1から4096の範囲内の整数である必要があります。

  • 文字列処理: 配列フィールド内の文字列値は、語義的なエスケープや変換なしにそのままで保存されます。たとえば、'a"b'"a'b"'a\'b'、および"a\"b"は入力されたまま保存されますが、'a'b'および"a"b"は無効な値と見なされます。

配列フィールドの追加

Zilliz Cloudクラスターで配列フィールドを使用するには、コレクションスキーマを作成するときに関連するフィールドタイプを定義します。このプロセスには以下が含まれます:

  1. datatypeをサポートされている配列データ型ARRAYに設定します。

  2. element_typeパラメータを使用して、配列内の要素のデータ型を指定します。同じ配列内のすべての要素は同じデータ型である必要があります。

  3. max_capacityパラメータを使用して、配列の最大容量(つまり、含めることができる要素の最大数)を定義します。

以下は、配列フィールドを含むコレクションスキーマを定義する方法です:

📘注釈

スキーマ定義時にenable_dynamic_fields=Trueを設定すると、Zilliz Cloudは事前に定義されていないスカラーフィールドの挿入を許可します。ただし、これによりクエリや管理の複雑さが増し、パフォーマンスに影響を与える可能性があります。詳細については、動的フィールドを参照してください。

# 必要なライブラリをインポート
from pymilvus import MilvusClient, DataType

# サーバーアドレスを定義
SERVER_ADDR = "YOUR_CLUSTER_ENDPOINT"

# MilvusClientインスタンスを作成
client = MilvusClient(uri=SERVER_ADDR)

# コレクションスキーマを定義
schema = client.create_schema(
auto_id=False,
enable_dynamic_fields=True,
)

# `tags`および`ratings`配列フィールドをnullable=Trueで追加
schema.add_field(field_name="tags", datatype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=10, max_length=65535, nullable=True)
schema.add_field(field_name="ratings", datatype=DataType.ARRAY, element_type=DataType.INT64, max_capacity=5, nullable=True)
schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)

インデックスパラメータの設定

インデックスは、検索およびクエリのパフォーマンスを向上させるのに役立ちます。Zilliz Cloudクラスターでは、ベクトルフィールドにインデックスを作成することが必須ですが、スカラーフィールドでは任意です。

以下の例では、AUTOINDEXインデックスタイプを使用して、ベクトルフィールドembeddingおよび配列フィールドtagsの両方にインデックスを作成します。このタイプでは、Milvusが自動的にデータ型に基づいて最も適切なインデックスを選択します。

# インデックスパラメータを設定

index_params = client.prepare_index_params()

# `age`をAUTOINDEXでインデックス化
index_params.add_index(
field_name="tags",
index_type="AUTOINDEX",
index_name="tags_index"
)

# `embedding`をAUTOINDEXでインデックス化し、類似性メトリックタイプを指定
index_params.add_index(
field_name="embedding",
index_type="AUTOINDEX", # 自動インデックスを使用して複雑なインデックス設定を簡略化
metric_type="COSINE" # 類似性メトリックタイプを指定。オプションにはL2、COSINE、またはIPが含まれます
)

コレクションの作成

スキーマとインデックスが定義されたら、配列フィールドを含むコレクションを作成します。

client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params
)

データ挿入

コレクションを作成した後、配列フィールドを含むデータを挿入できます。

# サンプルデータ
data = [
{
"tags": ["pop", "rock", "classic"],
"ratings": [5, 4, 3],
"pk": 1,
"embedding": [0.12, 0.34, 0.56]
},
{
"tags": None, # 配列全体がnull
"ratings": [4, 5],
"pk": 2,
"embedding": [0.78, 0.91, 0.23]
},
{ # tagsフィールドが完全に欠落
"ratings": [9, 5],
"pk": 3,
"embedding": [0.18, 0.11, 0.23]
}
]

client.insert(
collection_name="my_collection",
data=data
)

フィルター式を使用したクエリ

エンティティを挿入した後、queryメソッドを使用して指定されたフィルター式に一致するエンティティを取得できます。

tagsがnullでないエンティティを取得するには:

# `tags`がnullでないエンティティを除外するクエリ

filter = 'tags IS NOT NULL'

res = client.query(
collection_name="my_collection",
filter=filter,
output_fields=["tags", "ratings", "pk"]
)

print(res)

# 例の出力:
# data: [
# "{'tags': ['pop', 'rock', 'classic'], 'ratings': [5, 4, 3], 'pk': 1}"
# ]

ratingsの最初の要素の値が4より大きいエンティティを取得するには:

filter = 'ratings[0] > 4'

res = client.query(
collection_name="my_collection",
filter=filter,
output_fields=["tags", "ratings", "embedding"]
)

print(res)

# 例の出力:
# data: [
# "{'tags': ['pop', 'rock', 'classic'], 'ratings': [5, 4, 3], 'embedding': [0.12, 0.34, 0.56], 'pk': 1}",
# "{'tags': None, 'ratings': [9, 5], 'embedding': [0.18, 0.11, 0.23], 'pk': 3}"
# ]

フィルター式を使用したベクトル検索

基本的なスカラーフィールドのフィルタリングに加えて、ベクトル類似性検索をスカラーフィールドフィルターと組み合わせることができます。たとえば、以下のコードはベクトル検索にスカラーフィールドフィルターを追加する方法を示しています:

filter = 'tags[0] == "pop"'

res = client.search(
collection_name="my_collection",
data=[[0.3, -0.6, 0.1]],
limit=5,
search_params={"params": {"nprobe": 10}},
output_fields=["tags", "ratings", "embedding"],
filter=filter
)

print(res)

# 例の出力:
# data: [
# "[{'id': 1, 'distance': -0.2479381263256073, 'entity': {'tags': ['pop', 'rock', 'classic'], 'ratings': [5, 4, 3], 'embedding': [0.11999999731779099, 0.3400000035762787, 0.5600000023841858]}}]"
# ]

さらに、Zilliz CloudはARRAY_CONTAINSARRAY_CONTAINS_ALLARRAY_CONTAINS_ANY、およびARRAY_LENGTHのような高度な配列フィルタリング演算子をサポートしており、クエリ機能をさらに強化します。詳細については、配列演算子を参照してください。