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}", # 高效的范围过滤
)
2) varchar
/string
存储ISO 8601格式字符串
将日期时间格式化为字符串,如"2023-10-27T14:30:00Z
(UTC 时间)或"2023-10-27 14:30:00"。
reference
---
timestamp
https://milvus.io/docs/timestamp.md