Milvus 标量字段使用指南:从基础类型到高级特性详解

在使用 Milvus 构建向量数据库应用时,我们常常需要处理各种类型的标量数据 —— 从简单的字符串、数字,到复杂的 JSON 结构和数组。这些标量字段不仅是数据的重要属性,更是实现精准过滤和高效搜索的关键。今天,我们就来系统梳理 Milvus 中标量字段的核心特性和使用技巧,帮助大家更好地理解和运用这些功能。

一、字符串字段:灵活处理文本数据

在 Milvus 中,VARCHAR是专门用于存储字符串的类型。定义时需要关注两个核心参数:datatype需设置为DataType.VARCHARmax_length则决定了字符串的最大字符数(范围 1-65535)。如果希望支持空值或设置默认值,只需将nullable设为True,并通过default_value指定默认字符串。

实战示例:定义字符串字段

python

运行

from pymilvus import MilvusClient, DataType

# 连接Milvus服务
client = MilvusClient(uri="http://localhost:19530")

# 创建模式
schema = client.create_schema(
    auto_id=False,
    enable_dynamic_fields=True  # 允许动态字段,可选
)

# 添加带默认值的字符串字段(允许空值)
schema.add_field(
    field_name="varchar_field1",
    datatype=DataType.VARCHAR,
    max_length=100,
    nullable=True,
    default_value="Unknown"  # 未提供值时使用默认值
)

# 添加无默认值的字符串字段(允许空值)
schema.add_field(
    field_name="varchar_field2",
    datatype=DataType.VARCHAR,
    max_length=200,
    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)

查询与搜索:精准筛选字符串

插入数据后,我们可以通过过滤表达式轻松检索目标数据。例如,查询varchar_field1为 "Product A" 的记录,或筛选varchar_field2为空的实体。值得注意的是,空字符串("")与NULL不同,前者是有效字符串,后者表示字段缺失或未赋值。

python

运行

# 查询特定字符串值
filter_eq = 'varchar_field1 == "Product A"'
res = client.query(
    collection_name="my_collection",
    filter=filter_eq,
    output_fields=["varchar_field1", "varchar_field2"]
)

# 筛选空值字段
filter_null = 'varchar_field2 is null'
null_res = client.query(
    collection_name="my_collection",
    filter=filter_null,
    output_fields=["varchar_field1", "varchar_field2"]
)

二、数字字段:高效存储数值类型

数字字段支持多种类型,包括BOOLINT8INT16INT32INT64FLOATDOUBLE。定义时只需指定datatype,同样可通过nullabledefault_value处理空值和默认情况(仅适用于标量字段,主键除外)。

示例:创建数字字段

python

运行

# 添加整数字段(允许空值,默认18)
schema.add_field(
    field_name="age",
    datatype=DataType.INT64,
    nullable=True,
    default_value=18
)

# 添加浮点字段(允许空值,无默认值)
schema.add_field(
    field_name="price",
    datatype=DataType.FLOAT,
    nullable=True
)

数值过滤:支持数学表达式

查询时可直接使用数学运算符(>、<、== 等)。例如,检索age > 30的记录,或通过price is null筛选价格未填写的实体。结合向量搜索时,还能通过25 <= age <= 35这样的范围条件缩小搜索范围。

三、JSON 字段:结构化数据存储

JSON 字段用于存储键值对形式的元数据,支持嵌套结构,但需注意大小限制(65536 字节)。定义时使用DataType.JSON,通过nullable=True允许整个 JSON 对象为空,但不支持默认值。

索引优化:针对 JSON 路径建索引

默认情况下,JSON 字段未索引,复杂查询可能性能较低。建议对高频访问的路径建立反向索引(INVERTED类型),例如索引metadata["product_info"]["category"]作为字符串类型,或metadata["price"]作为数值类型:

python

运行

index_params = client.prepare_index_params()

# 索引JSON路径为字符串
index_params.add_index(
    field_name="metadata",
    index_type="INVERTED",
    index_name="json_index_1",
    params={
        "json_path": "metadata[\"product_info\"][\"category\"]",
        "json_cast_type": "varchar"
    }
)

# 索引JSON路径为数值
index_params.add_index(
    field_name="metadata",
    index_type="INVERTED",
    index_name="json_index_2",
    params={
        "json_path": "metadata[\"price\"]",
        "json_cast_type": "double"
    }
)

四、数组字段:处理有序集合数据

数组字段要求元素类型统一,通过element_type指定(如VARCHARINT64),并通过max_capacity限制元素数量(1-4096)。例如,存储标签列表["pop", "rock"]或评分数组[5, 4, 3]

定义示例:

python

运行

# 添加字符串数组(最大10个元素,每个元素最长65535字符)
schema.add_field(
    field_name="tags",
    datatype=DataType.ARRAY,
    element_type=DataType.VARCHAR,
    max_capacity=10,
    max_length=65535,  # 仅字符串数组需要
    nullable=True
)

# 添加整数数组(最大5个元素)
schema.add_field(
    field_name="ratings",
    datatype=DataType.ARRAY,
    element_type=DataType.INT64,
    max_capacity=5,
    nullable=True
)

查询技巧:访问数组元素

通过索引访问数组元素,例如ratings[0] > 4筛选第一个评分大于 4 的实体,或使用ARRAY_CONTAINS等高级操作符进行集合关系查询。

五、动态字段:灵活应对未定义字段

当我们希望插入 Schema 中未定义的字段时,只需在创建集合时启用enable_dynamic_fields=True。这些未定义字段会以键值对形式存储在保留的$meta JSON 字段中,支持像普通字段一样进行过滤和索引。

索引动态字段:

python

运行

# 为动态字段"color"创建索引
index_params.add_index(
    field_name="color",
    index_type="INVERTED",
    index_name="color_index",
    params={
        "json_path": "color",
        "json_cast_type": "varchar"
    }
)

六、可空值与默认值:数据缺失处理方案

  • 可空值(Nullable):允许字段在插入时缺失或赋值为None,需在创建时设置nullable=True。注意,空值在过滤时会被视为false,需显式查询field is null才能获取。
  • 默认值(Default Value):未提供值时自动应用预设值,支持标量字段(主键除外)。例如,age字段默认值 18,插入时未填写则自动赋值。

配置规则:

可空值 默认值 用户输入 结果
无 / 空 使用默认值
无 / 空 存储为空
无 / 空 使用默认值
无 / 空 抛出错误

七、字段属性修改:动态调整结构

创建集合后,部分字段属性可修改:

  • VARCHAR 字段:可调整max_length,例如将字符串最大长度从 100 改为 1024。
  • 数组字段:可修改max_capacity,但element_type不可变。
  • 内存映射:通过mmap.enabled启用内存映射,优化大数据量存储性能。

python

运行

# 修改VARCHAR字段长度
client.alter_collection_field(
    collection_name="my_collection",
    field_name="varchar_field1",
    field_params={"max_length": 1024}
)

总结:打造高效的数据模型

Milvus 的标量字段体系提供了丰富的类型支持和灵活的配置选项,无论是简单的字符串过滤,还是复杂的 JSON 路径查询,都能通过合理的 Schema 设计和索引优化实现高效处理。掌握这些特性,我们可以更从容地应对数据多样性挑战,构建高性能的向量数据库应用。

如果你在实际使用中遇到问题,或想了解更多细节,欢迎在评论区留言交流!觉得有用的话,别忘了点赞收藏,关注我获取更多 Milvus 技术干货~

你可能感兴趣的:(数据库与知识图谱,milvus)