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

ダイナミックフィールド

コレクションのスキーマで定義されたすべてのフィールドは、挿入するエンティティに含める必要があります。一部のフィールドをオプションにしたい場合は、動的フィールドを有効にすることを検討してください。このトピックでは、動的フィールドを有効にして使用する方法について説明します。

概要について

では、コレクション内の各フィールドの名前とデータ型を設定することで、コレクションスキーマを作成できます。スキーマにフィールドを追加する場合は、挿入するエンティティにこのフィールドが含まれていることを確認してください。一部のフィールドをオプションにしたい場合は、動的フィールドを有効にすることもできます。

動的フィールドは$metaという名前の予約フィールドで、Java Script Object Notation(JSON)タイプです。スキーマで定義されていないエンティティのフィールドは、この予約JSONフィールドにキーと値のペアとして保存されます。

動的フィールドが有効になっているコレクションでは、スキーマで明示的に定義されたフィールドと同様に、動的フィールドのキーをスカラーフィルターに使用できます。

ダイナミックフィールドを有効にする

コレクションを即座に作成」で説明されている方法を使用して作成されたコレクションには、動的フィールドがデフォルト有効になります。カスタム設定でコレクションを作成するときに、動的フィールドを手動で有効にすることもできます。

from pymilvus import MilvusClient

client= MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")

client.create_collection(
collection_name="my_dynamic_collection",
dimension=5,
enable_dynamic_field=True
)

ダイナミックフィールドを使用する

コレクションで動的フィールドが有効になっている場合、スキーマで定義されていないすべてのフィールドとその値は、動的フィールドにキーと値のペアとして保存されます。

例えば、コレクションスキーマがidvectorという2つのフィールドのみを定義し、動的フィールドが有効になっているとします。次のデータセットをこのコレクションに挿入します。

[
{id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},
{id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},
{id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},
{id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},
{id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},
{id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},
{id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},
{id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},
{id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},
{id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}
]

上記のデータセットには、idvectorcolorの各フィールドを含む10個のエンティティが含まれています。ここでは、colorフィールドはスキーマで定義されていません。コレクションには動的フィールドが有効になっているため、フィールドのは動的フィールド内のキーと値のペアとして保存されます。

データの挿入

次のコードは、このデータセットをコレクションに挿入する方法を示しています。

data=[
{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},
{"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},
{"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},
{"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},
{"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},
{"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},
{"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},
{"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},
{"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},
{"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}
]

res = client.insert(
collection_name="my_dynamic_collection",
data=data
)

print(res)

# Output
# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}

ダイナミックフィールドを使用したクエリと検索

は、クエリや検索中にフィルター式を使用することをサポートしており、結果に含めるフィールドを指定できます。次の例は、スキーマで定義されていないカラーフィールドを使用して、動的フィールドを使用してクエリや検索を実行する方法を示しています。

query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]

res = client.search(
collection_name="my_dynamic_collection",
data=[query_vector],
limit=5,
filter='color like "red%"',
output_fields=["color"]
)

print(res)

# Output
# data: ["[{'id': 1, 'distance': 0.6290165185928345, 'entity': {'color': 'red_7025'}}, {'id': 4, 'distance': 0.5975797176361084, 'entity': {'color': 'red_4794'}}, {'id': 6, 'distance': -0.24996188282966614, 'entity': {'color': 'red_9392'}}]"]

上記のコード例で使用されているフィルタ式では、color like"red%"and likes>50という条件で、colorフィールドの値は**"red"**で始まる必要があります。サンプルデータでは、この条件を満たすエンティティは2つしかありません。したがって、limit(topK)を3以下に設定すると、これらのエンティティの両方が返されます。

[
{
"id": 4,
"distance": 0.3345786594834839,
"entity": {
"vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106],
"color": "red_4794",
"likes": 122
}
},
{
"id": 6,
"distance": 0.6638239834383389
"entity": {
"vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987],
"color": "red_9392",
"likes": 58
}
},
]