数据类型 #

一、数据类型概览 #

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