milvus如何存储特殊类型的数据

1 时间数据

Milvus可以存储datetime信息,但没有专门的 datetime数据类型。

  1. int64存储Unix时间戳

将日期时间(如 "2023-10-27 14:30:00")转换为一个int64整数,代表自 1970年1月1日 00:00:00 UTC (Unix 纪元) 以来的秒数或毫秒数,示例代码如下。

复制代码
from datetime import datetime, timezone
import time
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection

# 连接 Milvus
connections.connect("default", host="localhost", port="19530")

# 定义 Schema (包含一个 INT64 时间戳字段)
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128),
    FieldSchema(name="timestamp", dtype=DataType.INT64),  # 存储 Unix 时间戳 (秒)
]
schema = CollectionSchema(fields, description="Example with datetime")
collection_name = "example_collection"
collection = Collection(collection_name, schema)

# 插入数据 - 转换 datetime 为 timestamp
current_dt = datetime.now(timezone.utc)  # 获取当前 UTC 时间
timestamp_sec = int(current_dt.timestamp())  # 转换为秒级 Unix 时间戳

data = [
    [1001],                                  # id
    [[0.1] * 128],                           # embedding (示例)
    [timestamp_sec],                         # timestamp
]

mr = collection.insert(data)

# 构建索引、加载集合 (略)...

# 查询 - 时间范围过滤 (查找过去24小时内插入的向量)
start_time = int((datetime.now(timezone.utc) - timedelta(hours=24)).timestamp())
end_time = int(datetime.now(timezone.utc).timestamp())

search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
results = collection.search(
    data=[[0.5]*128],                        # 查询向量
    anns_field="embedding",
    param=search_params,
    limit=10,
    expr=f"timestamp >= {start_time} AND timestamp <= {end_time}",  # 高效的范围过滤
)
  1. varchar/string存储ISO 8601格式字符串

将日期时间格式化为字符串,如"2023-10-27T14:30:00Z (UTC 时间)或"2023-10-27 14:30:00"。

reference


timestamp

https://milvus.io/docs/timestamp.md