跳到主要内容
版本:v2.5.x

动态字段

Collection 的 Schema 中定义的所有字段都必须包含在要插入的实体中。如果希望某些字段是可选的,可以考虑启用动态字段。本主题将介绍如何启用和使用动态字段。

概述

在 Milvus 中,可以通过设置 Collection 中每个字段的名称和数据类型来创建 Collection Schema。向 Schema 中添加字段时,请确保该字段包含在要插入的实体中。如果希望某些字段是可选的,启用动态字段是一种选择。

动态字段是一个名为**$meta** 的保留字段,属于 JavaScript Object Notation(JSON)类型。实体中任何未在 Schema 中定义的字段都将以键值对的形式存储在这个保留的 JSON 字段中。

对于启用了动态字段的 Collection,可以使用动态字段中的键进行标量过滤,就像使用模式中明确定义的字段一样。

启用动态字段

在创建具有自定义设置的 Collection 时,可以手动启用动态字段。

from pymilvus import MilvusClient

client= MilvusClient(uri="http://localhost:19530")

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

使用动态字段

在 Collection 中启用动态字段后,所有未在 Schema 中定义的字段及其值都将作为键值对存储在动态字段中。

例如,假设您的 Collection Schema 只定义了两个字段,名为idvector ,并启用了动态字段。现在,在此 Collection 中插入以下数据集。

[
{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"}
]

上面的数据集包含 10 个实体,每个实体都包括字段id,vector, 和color 。这里,Schema 中没有定义color 字段。由于 Collection 启用了动态字段,因此字段color 将作为键值对存储在动态字段中。

插入数据

以下代码演示了如何将此数据集插入 Collection。

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_collection",
data=data
)

print(res)

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

在动态字段中索引标量字段

启用动态字段后,任何未定义的标量字段都会以 JSON 格式存储为键值对。Milvus 支持在这种未定义的标量字段上创建索引,有效的方法是建立一个 JSON 路径索引。具体操作如下

  1. 选择要索引的 Dynamic Field 关键字。例如,上例中的"color"

  2. 为在该关键字中找到的值决定一个铸模类型。Milvus 将解析动态字段,提取指定键下的值,并将它们转换为你配置的类型。

    • 支持的json_cast_type 值有bool (或BOOL )、double (或DOUBLE )和varchar (或VARCHAR )。

    • 如果解析或转换失败(例如,试图将字符串解析为 double),索引将跳过这些行。

  3. 将该键的JSON 路径指定json_path 。由于 Dynamic Field 是以 JSON 格式存储的,因此可以指定类似"color" 这样的路径,如果有嵌套结构,则可以指定更深的路径(例如my_json["field"]["subfield"] )。

  4. 创建 INVERTED 索引。目前,JSON 路径索引只支持INVERTED 类型。

有关参数和注意事项的详细信息,请参阅JSON 字段索引

下面是如何在"color" 字段上创建索引的示例:

# Prepare index parameters
index_params = client.prepare_index_params()

index_params.add_index(
field_name="color", # Name of the "column" you see in queries (the dynamic key).
index_type="INVERTED", # Currently only "INVERTED" is supported for indexing JSON fields.
index_name="color_index", # Assign a name to this index.
params={
"json_path": "color", # JSON path to the key you want to index.
"json_cast_type": "varchar" # Type to which Milvus will cast the extracted values.
}
)

# Create the index
client.create_index(
collection_name="my_collection",
index_params=index_params
)

使用动态字段进行查询和搜索

Milvus 支持在查询和搜索过程中使用过滤表达式,允许您指定在结果中包含哪些字段。下面的示例演示了如何通过动态字段使用color 字段执行查询和搜索,该字段在 Schema 中没有定义。

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

res = client.search(
collection_name="my_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 字段的值必须以**"红色 "**开头。在示例数据中,只有两个实体符合这一条件。因此,当limit (topK) 设置为3 或更少时,将返回这两个实体。

[
{
"id": 1,
"distance": 0.6290165,
"entity": {
"color": "red_7025"
}
},
{
"id": 4,
"distance": 0.5975797,
"entity": {
"color": "red_4794"
}
},
{
"id": 6,
"distance": -0.24996188
"entity": {
"color": "red_9392"
}
},
]