数据类型 #
一、数据类型概览 #
text
Milvus数据类型分类:
┌─────────────────────────────────────────┐
│ 数据类型 │
├─────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────┐ │
│ │ 标量类型 (Scalar) │ │
│ │ ├── BOOL │ │
│ │ ├── INT8/INT16/INT32/INT64 │ │
│ │ ├── FLOAT/DOUBLE │ │
│ │ └── VARCHAR │ │
│ └─────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────┐ │
│ │ 向量类型 (Vector) │ │
│ │ ├── FLOAT_VECTOR │ │
│ │ ├── FLOAT16_VECTOR │ │
│ │ ├── BINARY_VECTOR │ │
│ │ └── SPARSE_FLOAT_VECTOR │ │
│ └─────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────┐ │
│ │ 复杂类型 (Complex) │ │
│ │ ├── ARRAY │ │
│ │ └── JSON │ │
│ └─────────────────────────────────┘ │
│ │
└─────────────────────────────────────────┘
二、标量类型 #
2.1 布尔类型 (BOOL) #
python
from pymilvus import FieldSchema, DataType
bool_field = FieldSchema(
name="is_active",
dtype=DataType.BOOL,
description="是否激活"
)
data = [True, False, True, False]
2.2 整数类型 #
python
int8_field = FieldSchema(
name="level",
dtype=DataType.INT8,
description="等级 (-128~127)"
)
int16_field = FieldSchema(
name="count",
dtype=DataType.INT16,
description="计数 (-32768~32767)"
)
int32_field = FieldSchema(
name="views",
dtype=DataType.INT32,
description="浏览量"
)
int64_field = FieldSchema(
name="id",
dtype=DataType.INT64,
is_primary=True,
description="主键ID"
)
2.3 浮点类型 #
python
float_field = FieldSchema(
name="price",
dtype=DataType.FLOAT,
description="价格 (32位精度)"
)
double_field = FieldSchema(
name="score",
dtype=DataType.DOUBLE,
description="分数 (64位精度)"
)
data = [
[3.14, 2.718, 1.414],
[0.123456789012345, 0.987654321098765]
]
2.4 字符串类型 (VARCHAR) #
python
varchar_field = FieldSchema(
name="title",
dtype=DataType.VARCHAR,
max_length=512,
description="标题"
)
long_text_field = FieldSchema(
name="content",
dtype=DataType.VARCHAR,
max_length=65535,
description="长文本内容"
)
data = [
"这是标题1",
"这是标题2",
"这是标题3"
]
2.5 标量类型范围 #
| 类型 | 范围 | 存储大小 |
|---|---|---|
| BOOL | True/False | 1 byte |
| INT8 | -128 ~ 127 | 1 byte |
| INT16 | -32768 ~ 32767 | 2 bytes |
| INT32 | -2147483648 ~ 2147483647 | 4 bytes |
| INT64 | -9223372036854775808 ~ 9223372036854775807 | 8 bytes |
| FLOAT | ±3.4E38 | 4 bytes |
| DOUBLE | ±1.7E308 | 8 bytes |
| VARCHAR | 1 ~ 65535 字符 | 变长 |
三、向量类型 #
3.1 浮点向量 (FLOAT_VECTOR) #
python
float_vector_field = FieldSchema(
name="embedding",
dtype=DataType.FLOAT_VECTOR,
dim=768,
description="浮点向量"
)
data = [
[0.1, 0.2, 0.3, ...],
[0.4, 0.5, 0.6, ...]
]
3.2 16位浮点向量 (FLOAT16_VECTOR) #
python
float16_vector_field = FieldSchema(
name="embedding_fp16",
dtype=DataType.FLOAT16_VECTOR,
dim=768,
description="16位浮点向量"
)
import numpy as np
data = [
np.array([0.1, 0.2, 0.3], dtype=np.float16).tolist()
]
3.3 二进制向量 (BINARY_VECTOR) #
python
binary_vector_field = FieldSchema(
name="binary_embedding",
dtype=DataType.BINARY_VECTOR,
dim=512,
description="二进制向量"
)
data = [
[0, 1, 0, 1, 1, 0, 0, 1, ...]
]
import numpy as np
binary_data = np.random.randint(0, 2, 512).tolist()
3.4 稀疏向量 (SPARSE_FLOAT_VECTOR) #
python
sparse_vector_field = FieldSchema(
name="sparse_embedding",
dtype=DataType.SPARSE_FLOAT_VECTOR,
description="稀疏向量"
)
data = [
{0: 0.1, 5: 0.3, 100: 0.5},
{1: 0.2, 10: 0.4, 200: 0.6}
]
3.5 向量类型对比 #
| 类型 | 精度 | 存储效率 | 适用场景 |
|---|---|---|---|
| FLOAT_VECTOR | 32位 | 标准 | 通用场景 |
| FLOAT16_VECTOR | 16位 | 高 | 内存受限 |
| BINARY_VECTOR | 1位 | 最高 | 图像哈希 |
| SPARSE_FLOAT_VECTOR | 32位 | 高维稀疏 | 文本TF-IDF |
四、复杂类型 #
4.1 JSON类型 #
python
json_field = FieldSchema(
name="metadata",
dtype=DataType.JSON,
description="JSON元数据"
)
data = [
{"author": "张三", "views": 1000, "tags": ["AI", "ML"]},
{"author": "李四", "views": 2000, "tags": ["Python", "DL"]}
]
4.2 JSON查询 #
python
results = collection.query(
expr='metadata["author"] == "张三"',
output_fields=["id", "metadata"]
)
results = collection.query(
expr='json_contains(metadata["tags"], "AI")',
output_fields=["id", "metadata"]
)
4.3 数组类型 (ARRAY) #
python
array_field = FieldSchema(
name="tags",
dtype=DataType.ARRAY,
element_type=DataType.VARCHAR,
max_capacity=20,
max_length=64,
description="标签数组"
)
int_array_field = FieldSchema(
name="scores",
dtype=DataType.ARRAY,
element_type=DataType.INT32,
max_capacity=100,
description="分数数组"
)
4.4 数组数据 #
python
data = [
[["AI", "ML", "Python"], ["Web", "JS", "React"]],
[[85, 90, 78], [92, 88, 95]]
]
4.5 数组查询 #
python
results = collection.query(
expr='array_contains(tags, "AI")',
output_fields=["id", "tags"]
)
results = collection.query(
expr='array_length(tags) > 2',
output_fields=["id", "tags"]
)
五、类型选择指南 #
5.1 标量类型选择 #
text
标量类型选择:
┌─────────────────────────────────────────┐
│ 数值范围判断 │
├─────────────────────────────────────────┤
│ │
│ 范围在 -128 ~ 127? │
│ └── 是 → INT8 │
│ │
│ 范围在 -32768 ~ 32767? │
│ └── 是 → INT16 │
│ │
│ 范围在 -21亿 ~ 21亿? │
│ └── 是 → INT32 │
│ │
│ 更大范围? │
│ └── 是 → INT64 │
│ │
│ 需要小数? │
│ ├── 一般精度 → FLOAT │
│ └── 高精度 → DOUBLE │
│ │
└─────────────────────────────────────────┘
5.2 向量类型选择 #
text
向量类型选择:
┌─────────────────────────────────────────┐
│ 向量类型决策 │
├─────────────────────────────────────────┤
│ │
│ 内存受限? │
│ └── 是 → FLOAT16_VECTOR │
│ │
│ 图像哈希/指纹? │
│ └── 是 → BINARY_VECTOR │
│ │
│ 高维稀疏数据? │
│ └── 是 → SPARSE_FLOAT_VECTOR │
│ │
│ 通用场景? │
│ └── 是 → FLOAT_VECTOR │
│ │
└─────────────────────────────────────────┘
5.3 复杂类型选择 #
text
复杂类型选择:
┌─────────────────────────────────────────┐
│ 结构化数据存储 │
├─────────────────────────────────────────┤
│ │
│ 需要灵活的键值对? │
│ └── 是 → JSON │
│ │
│ 固定类型的元素列表? │
│ └── 是 → ARRAY │
│ │
│ 需要查询嵌套字段? │
│ └── 是 → JSON │
│ │
│ 需要数组长度过滤? │
│ └── 是 → ARRAY │
│ │
└─────────────────────────────────────────┘
六、类型转换 #
6.1 Python类型映射 #
| Milvus类型 | Python类型 |
|---|---|
| BOOL | bool |
| INT8 | int |
| INT16 | int |
| INT32 | int |
| INT64 | int |
| FLOAT | float |
| DOUBLE | float |
| VARCHAR | str |
| FLOAT_VECTOR | list[float] |
| BINARY_VECTOR | list[int] |
| JSON | dict |
| ARRAY | list |
6.2 数据准备示例 #
python
import numpy as np
def prepare_data(schema, raw_data):
prepared = []
for field in schema.fields:
if field.dtype == DataType.FLOAT_VECTOR:
data = [np.array(v, dtype=np.float32).tolist() for v in raw_data[field.name]]
elif field.dtype == DataType.FLOAT16_VECTOR:
data = [np.array(v, dtype=np.float16).tolist() for v in raw_data[field.name]]
elif field.dtype == DataType.INT64:
data = [int(v) for v in raw_data[field.name]]
elif field.dtype == DataType.FLOAT:
data = [float(v) for v in raw_data[field.name]]
else:
data = raw_data[field.name]
prepared.append(data)
return prepared
七、完整示例 #
7.1 多类型Schema #
python
from pymilvus import FieldSchema, CollectionSchema, DataType, Collection
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="name", dtype=DataType.VARCHAR, max_length=256),
FieldSchema(name="age", dtype=DataType.INT32),
FieldSchema(name="score", dtype=DataType.DOUBLE),
FieldSchema(name="is_active", dtype=DataType.BOOL),
FieldSchema(name="tags", dtype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=10, max_length=32),
FieldSchema(name="metadata", dtype=DataType.JSON),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128)
]
schema = CollectionSchema(fields, "多类型示例")
collection = Collection("multi_types", schema)
data = [
[1, 2, 3],
["张三", "李四", "王五"],
[25, 30, 28],
[85.5, 92.3, 78.9],
[True, False, True],
[["AI", "ML"], ["Web", "JS"], ["Data", "Python"]],
[{"level": "A"}, {"level": "B"}, {"level": "A"}],
[[0.1]*128, [0.2]*128, [0.3]*128]
]
collection.insert(data)
八、总结 #
数据类型速查表:
| 类型 | 用途 | 示例 |
|---|---|---|
| INT64 | 主键、大整数 | 1234567890 |
| INT32 | 计数、数量 | 1000 |
| FLOAT | 价格、比率 | 3.14 |
| DOUBLE | 高精度数值 | 3.14159265 |
| VARCHAR | 字符串 | “hello” |
| BOOL | 开关状态 | True |
| FLOAT_VECTOR | 向量 | [0.1, 0.2, …] |
| JSON | 结构化数据 | |
| ARRAY | 数组 | [1, 2, 3] |
下一步,让我们学习向量操作!
最后更新:2026-04-04