Milvus 向量数据库支持多种数据类型,用于存储向量及其关联的元数据。这些数据类型用于定义集合(Collection)的 schema,涵盖向量字段和标量字段,适用于不同的应用场景,如语义搜索、推荐系统和图像检索等。以下是对 Milvus 支持的数据类型的全面介绍,包括每种类型的定义、用途、限制和示例,基于 Milvus 2.x(截至 2025 年 4 月的最新版本)。
1. 概述
在 Milvus 中,集合的 schema 由多个字段(Field)组成,每个字段对应一种数据类型。字段分为两类:
- 向量字段:存储高维向量,用于相似性搜索。
- 标量字段:存储元数据(如 ID、标签、时间戳),用于过滤和查询。
Milvus 支持以下主要数据类型:
- 向量类型:
FLOAT_VECTOR
、BINARY_VECTOR
、FLOAT16_VECTOR
、BFLOAT16_VECTOR
、SPARSE_FLOAT_VECTOR
- 标量类型:
BOOL
、INT8
、INT16
、INT32
、INT64
、FLOAT
、DOUBLE
、VARCHAR
、JSON
、ARRAY
以下逐一介绍每种数据类型,包括其定义、用途和使用示例。
2. 向量数据类型
向量数据类型用于存储高维向量,通常由机器学习模型(如 BERT、ResNet)生成,用于表示文本、图像、音频等数据的嵌入。
(1) FLOAT_VECTOR
- 定义:存储 32 位浮点数(float32)向量,每个维度是一个浮点值。
- 用途:最常用的向量类型,适合大多数机器学习模型生成的嵌入(如 Sentence-BERT、CLIP)。
- 限制:
- 维度范围:1 到 32,768。
- 每个向量占用
dimension * 4
字节。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="FLOAT_VECTOR example") # 创建集合 client.create_collection(collection_name="float_vector_example", schema=schema) # 插入数据 data = [ {"id": i, "vector": [float(i) / 100 for _ in range(128)]} for i in range(10) ] client.insert(collection_name="float_vector_example", data=data)
(2) BINARY_VECTOR
- 定义:存储二进制向量,每个维度是 1 位(bit),每 8 位存储为一个字节。
- 用途:适合某些高效的嵌入模型(如二值化特征),或需要低存储成本的场景。
- 限制:
- 维度范围:1 到 32,768。
- 维度必须是 8 的倍数(因为按字节存储)。
- 每个向量占用
dimension / 8
字节。 - 仅支持
HAMMING
(汉明距离)、JACCARD
和TANIMOTO
距离度量。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType import random client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="vector", dtype=DataType.BINARY_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="BINARY_VECTOR example") # 创建集合 client.create_collection(collection_name="binary_vector_example", schema=schema) # 插入数据 data = [ {"id": i, "vector": [random.randint(0, 1) for _ in range(128)]} for i in range(10) ] client.insert(collection_name="binary_vector_example", data=data)
(3) FLOAT16_VECTOR
- 定义:存储 16 位浮点数(float16)向量,精度低于 float32。
- 用途:适合内存受限的场景,减少存储和计算开销,常用于移动设备或大规模数据集。
- 限制:
- 维度范围:1 到 32,768。
- 每个向量占用
dimension * 2
字节。 - 精度较低,可能影响搜索质量。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="vector", dtype=DataType.FLOAT16_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="FLOAT16_VECTOR example") # 创建集合 client.create_collection(collection_name="float16_vector_example", schema=schema)
(4) BFLOAT16_VECTOR
- 定义:存储 16 位脑浮点数(bfloat16)向量,保留更大的指数范围,牺牲部分精度。
- 用途:适合深度学习模型(如 Transformer),在 GPU 上性能优异。
- 限制:
- 维度范围:1 到 32,768。
- 每个向量占用
dimension * 2
字节。 - 硬件支持要求(如 GPU 兼容 bfloat16)。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="vector", dtype=DataType.BFLOAT16_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="BFLOAT16_VECTOR example") # 创建集合 client.create_collection(collection_name="bfloat16_vector_example", schema=schema)
(5) SPARSE_FLOAT_VECTOR
- 定义:存储稀疏浮点向量,仅保存非零值及其索引,格式为
{index: value}
。 - 用途:适合稀疏数据,如 BM25 词频向量或稀疏嵌入,显著减少存储空间。
- 限制:
- 维度范围:无固定上限(取决于非零值数量)。
- 仅支持
IP
(内积)距离度量。 - 需要稀疏索引(如
SPARSE_INVERTED_INDEX
)。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="vector", dtype=DataType.SPARSE_FLOAT_VECTOR) ] schema = CollectionSchema(fields=fields, description="SPARSE_FLOAT_VECTOR example") # 创建集合 client.create_collection(collection_name="sparse_vector_example", schema=schema) # 插入数据 data = [ {"id": 0, "vector": {0: 0.1, 100: 0.5}}, # 稀疏向量 {"id": 1, "vector": {1: 0.2, 200: 0.3}} ] client.insert(collection_name="sparse_vector_example", data=data)
3. 标量数据类型
标量数据类型用于存储元数据,类似于传统数据库中的字段,支持过滤和查询操作。
(1) BOOL
- 定义:存储布尔值(
True
或False
)。 - 用途:表示二元状态,如是否有效、是否标记等。
- 限制:占用 1 字节。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="is_active", dtype=DataType.BOOL), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="BOOL example") # 创建集合 client.create_collection(collection_name="bool_example", schema=schema) # 插入数据 data = [{"id": 0, "is_active": True, "vector": [0.1] * 128}] client.insert(collection_name="bool_example", data=data)
(2) INT8
- 定义:存储 8 位有符号整数(-128 到 127)。
- 用途:适合存储小型整数,如类别编号。
- 限制:占用 1 字节。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="category", dtype=DataType.INT8), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="INT8 example") # 创建集合 client.create_collection(collection_name="int8_example", schema=schema) # 插入数据 data = [{"id": 0, "category": 1, "vector": [0.1] * 128}] client.insert(collection_name="int8_example", data=data)
(3) INT16
- 定义:存储 16 位有符号整数(-32,768 到 32,767)。
- 用途:适合中等范围的整数,如计数器。
- 限制:占用 2 字节。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="count", dtype=DataType.INT16), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="INT16 example") # 创建集合 client.create_collection(collection_name="int16_example", schema=schema)
(4) INT32
- 定义:存储 32 位有符号整数(-2,147,483,648 到 2,147,483,647)。
- 用途:适合较大的整数,如时间戳、计数。
- 限制:占用 4 字节。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="timestamp", dtype=DataType.INT32), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="INT32 example") # 创建集合 client.create_collection(collection_name="int32_example", schema=schema)
(5) INT64
- 定义:存储 64 位有符号整数(-2^63 到 2^63-1)。
- 用途:常用作主键(Primary Key)或唯一标识符。
- 限制:占用 8 字节。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="INT64 example") # 创建集合 client.create_collection(collection_name="int64_example", schema=schema) # 插入数据 data = [{"vector": [0.1] * 128}] # id 自动生成 client.insert(collection_name="int64_example", data=data)
(6) FLOAT
- 定义:存储 32 位浮点数(float32)。
- 用途:表示浮点值,如价格、分数。
- 限制:占用 4 字节。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="price", dtype=DataType.FLOAT), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="FLOAT example") # 创建集合 client.create_collection(collection_name="float_example", schema=schema) # 插入数据 data = [{"id": 0, "price": 99.99, "vector": [0.1] * 128}] client.insert(collection_name="float_example", data=data)
(7) DOUBLE
- 定义:存储 64 位浮点数(float64)。
- 用途:适合高精度浮点计算,如科学数据。
- 限制:占用 8 字节。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="precision", dtype=DataType.DOUBLE), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="DOUBLE example") # 创建集合 client.create_collection(collection_name="double_example", schema=schema)
(8) VARCHAR
- 定义:存储变长字符串。
- 用途:存储文本数据,如名称、描述、标签。
- 限制:
- 最大长度:1 到 65,535 字节(需在创建时指定)。
- 支持 UTF-8 编码。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="name", dtype=DataType.VARCHAR, max_length=255), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="VARCHAR example") # 创建集合 client.create_collection(collection_name="varchar_example", schema=schema) # 插入数据 data = [{"id": 0, "name": "item_001", "vector": [0.1] * 128}] client.insert(collection_name="varchar_example", data=data)
(9) JSON
- 定义:存储 JSON 格式的键值对,支持动态字段。
- 用途:适合存储结构化但灵活的元数据,如属性字典。
- 限制:占用空间取决于 JSON 内容。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="attributes", dtype=DataType.JSON), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="JSON example") # 创建集合 client.create_collection(collection_name="json_example", schema=schema) # 插入数据 data = [ {"id": 0, "attributes": {"color": "red", "size": "large"}, "vector": [0.1] * 128} ] client.insert(collection_name="json_example", data=data)
(10) ARRAY
- 定义:存储固定类型的元素数组(如 INT32 数组、VARCHAR 数组)。
- 用途:适合存储列表数据,如标签列表、分数序列。
- 限制:
- 元素类型需一致(如全 INT32 或全 VARCHAR)。
- 最大长度需在创建时指定。
- 示例:
from pymilvus import MilvusClient from pymilvus import CollectionSchema, FieldSchema, DataType client = MilvusClient(uri="http://localhost:19530") # 定义 schema fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="tags", dtype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=10, max_length=50), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="ARRAY example") # 创建集合 client.create_collection(collection_name="array_example", schema=schema) # 插入数据 data = [ {"id": 0, "tags": ["tag1", "tag2"], "vector": [0.1] * 128} ] client.insert(collection_name="array_example", data=data)
4. 字段属性与约束
在定义字段时,可以设置以下属性:
- is_primary:是否为主键(仅限
INT64
或VARCHAR
),用于唯一标识记录。 - auto_id:是否自动生成主键(仅限
INT64
或VARCHAR
)。 - params:字段特定参数,如:
- 向量字段:
dimension
(维度)。 VARCHAR
:max_length
(最大长度)。ARRAY
:element_type
(元素类型)、max_capacity
(最大元素数)。
- 向量字段:
示例(带约束的集合):
from pymilvus import MilvusClient
from pymilvus import CollectionSchema, FieldSchema, DataType
client = MilvusClient(uri="http://localhost:19530")
# 定义 schema
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128),
FieldSchema(name="name", dtype=DataType.VARCHAR, max_length=255),
FieldSchema(name="attributes", dtype=DataType.JSON)
]
schema = CollectionSchema(fields=fields, description="Complex example")
# 创建集合
client.create_collection(collection_name="complex_example", schema=schema)
5. 使用场景与选择建议
- 向量类型选择:
FLOAT_VECTOR
:默认选择,适合大多数 NLP 和 CV 任务。BINARY_VECTOR
:用于二值化特征或低存储场景。FLOAT16_VECTOR
/BFLOAT16_VECTOR
:用于内存优化或特定硬件加速。SP roadside_float_vector
:用于稀疏数据,如关键词搜索。
- 标量类型选择:
INT64
:作为主键或大整数。VARCHAR
:存储文本或标签。JSON
:存储灵活的结构化数据。ARRAY
:存储列表或序列。BOOL
/FLOAT
:存储简单状态或数值。
6. 注意事项
- 向量维度:插入的向量维度必须与集合定义一致。
- 存储开销:
FLOAT_VECTOR
占用较多空间,考虑FLOAT16_VECTOR
或SPARSE_FLOAT_VECTOR
优化。JSON
和ARRAY
可能增加存储复杂性。
- 过滤支持:标量字段支持过滤表达式(如
category == 'cat_0'
),但JSON
和ARRAY
的过滤功能可能有限。 - 兼容性:确保
pymilvus
版本(如 2.5.0)与 Milvus 服务版本兼容。
7. 总结
Milvus 支持丰富的向量和标量数据类型,满足多样化的存储和查询需求。向量类型(如 FLOAT_VECTOR
、SPARSE_FLOAT_VECTOR
)用于相似性搜索,标量类型(如 INT64
、VARCHAR
、JSON
)用于元数据管理和过滤。选择合适的数据类型取决于应用场景(如存储空间、精度要求、查询性能)。