【Milvus】主要数据类型(向量类型和标量类型)列举和说明

Milvus 向量数据库支持多种数据类型,用于存储向量及其关联的元数据。这些数据类型用于定义集合(Collection)的 schema,涵盖向量字段和标量字段,适用于不同的应用场景,如语义搜索、推荐系统和图像检索等。以下是对 Milvus 支持的数据类型的全面介绍,包括每种类型的定义、用途、限制和示例,基于 Milvus 2.x(截至 2025 年 4 月的最新版本)。


1. 概述

在 Milvus 中,集合的 schema 由多个字段(Field)组成,每个字段对应一种数据类型。字段分为两类:

  • 向量字段:存储高维向量,用于相似性搜索。
  • 标量字段:存储元数据(如 ID、标签、时间戳),用于过滤和查询。

Milvus 支持以下主要数据类型:

  • 向量类型:FLOAT_VECTORBINARY_VECTORFLOAT16_VECTORBFLOAT16_VECTORSPARSE_FLOAT_VECTOR
  • 标量类型:BOOLINT8INT16INT32INT64FLOATDOUBLEVARCHARJSONARRAY

以下逐一介绍每种数据类型,包括其定义、用途和使用示例。


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(汉明距离)、JACCARDTANIMOTO 距离度量。
  • 示例
      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

  • 定义:存储布尔值(TrueFalse)。
  • 用途:表示二元状态,如是否有效、是否标记等。
  • 限制:占用 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:是否为主键(仅限 INT64VARCHAR),用于唯一标识记录。
  • auto_id:是否自动生成主键(仅限 INT64VARCHAR)。
  • params:字段特定参数,如:
    • 向量字段:dimension(维度)。
    • VARCHARmax_length(最大长度)。
    • ARRAYelement_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_VECTORSPARSE_FLOAT_VECTOR 优化。
    • JSONARRAY 可能增加存储复杂性。
  • 过滤支持:标量字段支持过滤表达式(如 category == 'cat_0'),但 JSONARRAY 的过滤功能可能有限。
  • 兼容性:确保 pymilvus 版本(如 2.5.0)与 Milvus 服务版本兼容。

7. 总结

Milvus 支持丰富的向量和标量数据类型,满足多样化的存储和查询需求。向量类型(如 FLOAT_VECTORSPARSE_FLOAT_VECTOR)用于相似性搜索,标量类型(如 INT64VARCHARJSON)用于元数据管理和过滤。选择合适的数据类型取决于应用场景(如存储空间、精度要求、查询性能)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值