在使用 Milvus 构建向量数据库应用时,我们常常需要处理各种类型的标量数据 —— 从简单的字符串、数字,到复杂的 JSON 结构和数组。这些标量字段不仅是数据的重要属性,更是实现精准过滤和高效搜索的关键。今天,我们就来系统梳理 Milvus 中标量字段的核心特性和使用技巧,帮助大家更好地理解和运用这些功能。
在 Milvus 中,VARCHAR
是专门用于存储字符串的类型。定义时需要关注两个核心参数:datatype
需设置为DataType.VARCHAR
,max_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"]
)
数字字段支持多种类型,包括BOOL
、INT8
、INT16
、INT32
、INT64
、FLOAT
、DOUBLE
。定义时只需指定datatype
,同样可通过nullable
和default_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 字段用于存储键值对形式的元数据,支持嵌套结构,但需注意大小限制(65536 字节)。定义时使用DataType.JSON
,通过nullable=True
允许整个 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
指定(如VARCHAR
、INT64
),并通过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"
}
)
None
,需在创建时设置nullable=True
。注意,空值在过滤时会被视为false
,需显式查询field is null
才能获取。age
字段默认值 18,插入时未填写则自动赋值。可空值 | 默认值 | 用户输入 | 结果 |
---|---|---|---|
✅ | ✅ | 无 / 空 | 使用默认值 |
✅ | ❌ | 无 / 空 | 存储为空 |
❌ | ✅ | 无 / 空 | 使用默认值 |
❌ | ❌ | 无 / 空 | 抛出错误 |
创建集合后,部分字段属性可修改:
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 技术干货~