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

Array フィールド

ARRAY フィールドは、同じデータ型の要素を順序付きリストとして格納します。

ARRAY フィールドによるデータの格納例を次に示します。

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

制限​

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

  • データ型: ARRAY フィールド内のすべての要素は、element_type パラメーターで定義される同じデータ型である必要があります。element_type に VARCHAR を設定する場合は、各配列要素に許可される最大バイト数を定義する max_length も指定する必要があります。element_type には、JSON を除く、Zilliz Cloud がサポートする任意のスカラーデータ型を指定できます。element_type=STRUCT の場合は、StructArray フィールドを使用し、struct_schema を指定します。詳細は、StructArray を参照してください。

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

  • 文字列の処理: Array フィールド内の文字列値は、意味的なエスケープや変換を行わずに、そのまま格納されます。たとえば、'a"b'、"a'b"、'a\'b'、"a\"b" は入力どおりに格納され、'a'b' と "a"b" は無効な値と見なされます。

ARRAY フィールドを追加する​

Zilliz Cloud クラスターで ARRAY フィールドを使用するには、コレクションスキーマの作成時に該当するフィールド型を定義します。このプロセスには、以下の手順が含まれます。

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

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

  3. max_capacity パラメーターを使用して、配列の最大容量、つまり配列に格納できる要素の最大数を定義します。

ARRAY フィールドを含むコレクションスキーマを定義する方法は、以下の通りです。

📘Notes

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

python
# Import necessary libraries
from pymilvus import MilvusClient, DataType

# Define server address
SERVER_ADDR = "YOUR_CLUSTER_ENDPOINT"

# Create a MilvusClient instance
client = MilvusClient(uri=SERVER_ADDR)

# Define the collection schema
schema = client.create_schema(
auto_id=False,
enable_dynamic_field=True,
)

# Add `tags` and `ratings` ARRAY fields with 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 クラスターでは、ベクトルフィールドのインデックス作成は必須ですが、スカラーフィールドのインデックス作成は任意です。

次の例では、ベクトルフィールド embedding と ARRAY フィールド tags にインデックスを作成します。どちらも AUTOINDEX インデックスタイプを使用します。このタイプでは、Zilliz Cloud がデータ型に基づいて最適なインデックスを自動的に選択します。各フィールドのインデックスタイプとパラメーターはカスタマイズすることもできます。詳細は、Index Explained を参照してください。

python
# Set index params
index_params = client.prepare_index_params()

# Index `tags` with AUTOINDEX
index_params.add_index(
field_name="tags",
index_type="AUTOINDEX",
index_name="tags_index"
)

# Index `embedding` with AUTOINDEX and specify similarity metric type
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, options include L2, COSINE, or IP
)

コレクションを作成する​

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

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

# Load the collection into memory before performing searches and queries
client.load_collection(collection_name="my_collection")

データを挿入する​

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

python
# Sample data
data = [
{
"tags": ["pop", "rock", "classic"],
"ratings": [5, 4, 3],
"pk": 1,
"embedding": [0.12, 0.34, 0.56]
},
{
"tags": None, # Entire ARRAY is null
"ratings": [4, 5],
"pk": 2,
"embedding": [0.78, 0.91, 0.23]
},
{ # The tags field is completely missing
"ratings": [9, 5],
"pk": 3,
"embedding": [0.18, 0.11, 0.23]
}
]

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

配列全体を挿入するだけでなく、ARRAY フィールドは upsert API の ARRAY_APPEND および ARRAY_REMOVE 部分更新演算子もサポートしています。これらを使用すると、既存の配列の現在値を先に取得することなく、配列に要素を追加したり、一致する要素を削除したりできます。これにより、クライアント側の読み取り・変更・書き込みのパターンを回避できます。詳細は、Upsert array fields in merge mode を参照してください。

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

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

tags が null でないエンティティを取得するには、次のようにします。

python
# Query entities where `tags` is not null
filter = 'tags IS NOT NULL'

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

print(res)

ratings の最初の要素の値が 4 より大きいエンティティを取得するには、次のようにします。

python
filter = 'ratings[0] > 4'

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

print(res)

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

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

python
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)

さらに、Zilliz Cloud は、クエリ機能をさらに強化するために、ARRAY_CONTAINS、ARRAY_CONTAINS_ALL、ARRAY_CONTAINS_ANY、ARRAY_LENGTH などの高度な Array フィルタリング演算子をサポートしています。詳細は、ARRAY Operators を参照してください。