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

配列フィールド

Array型は、同じデータ型の複数の値を含むフィールドを格納するために使用されます。複数の要素を持つ属性を格納する柔軟な方法を提供し、関連するデータのセットを保存する必要があるシナリオで特に役立ちます。Zilliz Cloudクラスターでは、Arrayフィールドをベクトルデータと一緒に格納でき、より複雑なクエリやフィルタリング要件を可能にします。

例えば、音楽推薦システムでは、Arrayフィールドは曲のタグのリストを保存できます。ユーザー行動分析では、曲のユーザー評価を保存できます。以下は典型的なArrayフィールドの例です

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

この例では、tagsratingsは両方ともArrayフィールドです。tagsフィールドは、ポップ、ロック、クラシックなどの曲のジャンルを表す文字列配列であり、評価フィールドは、1から5までのユーザーのratingsを表す整数配列です。これらのArrayフィールドは、マルチバリューデータを柔軟に格納する方法を提供し、クエリやフィルタリング中に詳細な分析を行いやすくします。

配列フィールドを追加

Array fieldsを使用するにはZilliz Cloudクラスター、コレクションスキーマを作成する際に関連するフィールドタイプを定義します。この過程には以下が含まれます:

  1. サポートされるArrayデータ型であるARRAYにデータ型を設定します。

  2. 配列内の要素のデータ型を指定するには、element_typeパラメータを使用します。これは、Zilliz Cloudクラスターでサポートされている任意のスカラーデータ型である必要があります。例えば、VARCHARINT64などです。同じ配列内のすべての要素は同じデータ型でなければなりません。

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

配列フィールドを含むコレクションスキーマを定義する方法は次のとおりです:

from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")

schema = client.create_schema(
auto_id=False,
enable_dynamic_fields=True,
)

# Add an Array field with elements of type VARCHAR
schema.add_field(field_name="tags", datatype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=10)
# Add an Array field with elements of type INT64
schema.add_field(field_name="ratings", datatype=DataType.ARRAY, element_type=DataType.INT64, max_capacity=5)

# Add primary field
schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)

# Add vector field
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)

この例では:

  • tagselement_typeVARCHARに設定された文字列配列であり、配列内の要素は文字列でなければならないことを示しています。max_Capacityは10に設定されており、配列には最大10個の要素を含めることができます。

  • ratingelement_typeINT64に設定された整数配列であり、要素は整数でなければならないことを示しています。max_Capacityは5に設定されており、最大5つの評価が可能です。

  • また、主キーフィールドpkとベクトルフィールドの埋め込みを追加します。

📘ノート

コレクションを作成する際には、プライマリフィールドとベクトルフィールドは必須です。プライマリフィールドは各エンティティを一意に識別し、ベクトルフィールドは類似検索に重要です。詳細については、「プライマリフィールドとAutoID」、「密集ベクトル」、「バイナリベクトル」、または「疎ベクトル」を参照してください。

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

配列フィールドのインデックスパラメータの設定はオプションですが、検索効率を大幅に向上させることができます。

次の例では、AUTOINDEXタグフィールドに作成します。つまり、Zilliz Cloudクラスターは、データ型に基づいて適切なスカラーインデックスを自動的に作成します。詳細については、「AUTOINDEXの説明」を参照してください。

# Prepare index parameters
index_params = client.prepare_index_params() # Prepare IndexParams object

index_params.add_index(
field_name="tags", # Name of the Array field to index
index_type="AUTOINDEX", # Index type
index_name="inverted_index" # Index name
)

さらに、コレクションを作成する前にベクトルフィールドのインデックスを作成する必要があります。この例では、ベクトルインデックスの設定を簡素化するためにAUTOINDEXを使用しています。

# Add vector index
index_params.add_index(
field_name="embedding",
index_type="AUTOINDEX", # Use automatic indexing to simplify complex index settings
metric_type="COSINE" # Specify similarity metric type, such as L2, COSINE, or IP
)

コレクションを作成

定義されたスキーマとインデックスパラメータを使用して、コレクションを作成します。

client.create_collection(
collection_name="my_array_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": ["jazz", "blues"],
"ratings": [4, 5],
"pk": 2,
"embedding": [0.78, 0.91, 0.23]
},
{
"tags": ["electronic", "dance"],
"ratings": [3, 3, 4],
"pk": 3,
"embedding": [0.67, 0.45, 0.89]
}
]

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

この例では:

  • 各データエントリにはプライマリフィールド(pk)が含まれ、tagsratingsはタグと評価を格納するために使用される配列フィールドです。

  • embeddingは、ベクトル類似性検索に使用される3次元ベクトル場です。

検索とクエリ

配列フィールドを使用すると、検索中にスカラーフィルタリングが可能になり、Milvusのベクトル検索機能が強化されます。ベクトル類似検索とともに、配列フィールドのプロパティに基づいてクエリを実行できます。

クエリのフィルター

特定の要素へのアクセスや、配列要素が特定の条件を満たすかどうかのチェックなど、Arrayフィールドのプロパティに基づいてデータをフィルタリングできます。

filter = 'ratings[0] < 4'

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

print(res)

# Output
# data: ["{'pk': 3, 'tags': ['electronic', 'dance'], 'ratings': [3, 3, 4], 'embedding': [np.float32(0.67), np.float32(0.45), np.float32(0.89)]}"]

このクエリでは、Zilliz Cloudクラスターは、ratings配列の最初の要素が小なり4であるエンティティをフィルタリングし、条件に一致するエンティティを返します。

配列フィルタリングによるベクトル検索

ベクトル類似性と配列フィルタリングを組み合わせることで、検索されたデータが意味的に類似しているだけでなく、特定の条件を満たしていることを確認でき、検索結果をより正確にし、ビジネスニーズに合わせることができます。

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

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

print(res)

# Output
# data: ["[{'id': 1, 'distance': 1.1276001930236816, 'entity': {'ratings': [5, 4, 3], 'embedding': [0.11999999731779099, 0.3400000035762787, 0.5600000023841858], 'tags': ['pop', 'rock', 'classic']}}]"]

この例では、Zilliz Cloudは、タグ配列の最初の要素が"pop"であるクエリベクトルに最も似た上位5つのエンティティを返します。

さらに、Zilliz Cloudは、ARRAY_CONTAINSARRAY_CONTAINS_ALLARRAY_CONTAINS_ANYARRAY_LENGTHなどの高度な配列フィルタリング演算子をサポートしています。詳細については、「アレイ演算子」を参照してください。

限界

  • データ型:配列フィールド内のすべての要素は、element_typeで指定された同じデータ型でなければなりません。

  • Array Capacity: Arrayフィールドの要素数は、Arrayが作成されたときに定義された最大容量に小なりまたは等しくなければなりません。max_Capacityで指定されています。

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