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

配列フィールド

ARRAYフィールドは、同じデータ型の要素の順序付きセットを格納します。以下は、ARRAYフィールドがデータを格納する方法の例です。

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

限界{#}

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

  • データ型: Arrayフィールドのすべての要素は、element_typeで指定された同じデータ型でなければなりません。element_typeVARCHARに設定した場合、配列要素のmax_lengthも設定する必要があります。

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

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

ARRAYフィールドを追加

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

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

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

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

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

📘ノート

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

# 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_fields=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)
export arrayField1='{
"fieldName": "tags",
"dataType": "Array",
"elementDataType": "VarChar",
"elementTypeParams": {
"max_capacity": 10,
"max_length": 65535
}
}'

export arrayField2='{
"fieldName": "ratings",
"dataType": "Array",
"elementDataType": "Int64",
"elementTypeParams": {
"max_capacity": 5
}
}'

export pkField='{
"fieldName": "pk",
"dataType": "Int64",
"isPrimary": true
}'

export vectorField='{
"fieldName": "embedding",
"dataType": "FloatVector",
"elementTypeParams": {
"dim": 3
}
}'

export schema="{
\"autoID\": false,
\"fields\": [
$arrayField1,
$arrayField2,
$pkField,
$vectorField
]
}"

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

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

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

# Set index params

index_params = client.prepare_index_params()

# Index `age` 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フィールドを含むコレクションを作成してください。

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

データの挿入

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

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

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

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

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

# Query to exclude 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)

# Example output:
# 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)

# Example output:
# 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)

# Example output:
# 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_ANYARRAY_LENGTHなどの高度な配列フィルタリング演算子をサポートしています。詳細については、アレイ演算子を参照してください。