
qdrant 当前版本(v1.7.x 及更早)不支持直接使用 datetime 对象进行范围过滤,需将时间转换为 unix 时间戳(整型秒或毫秒)后,通过 range 过滤器实现精准时间筛选。
qdrant 当前版本(v1.7.x 及更早)不支持直接使用 datetime 对象进行范围过滤,需将时间转换为 unix 时间戳(整型秒或毫秒)后,通过 range 过滤器实现精准时间筛选。
在 Qdrant 中对时间字段(如 timestamp)执行过滤时,必须确保该字段在向量点(point)中以数值类型(int 或 float)存储,且查询条件中的值也必须是数值——因为 Qdrant 的底层过滤引擎(Tantivy)仅原生支持数值、字符串、布尔及地理坐标等有限类型,尚未在 v1.7.x 中支持原生 datetime 类型(该能力计划于 v1.8.0 正式引入)。
因此,推荐采用 Unix 时间戳标准化方案,即统一使用毫秒级时间戳(int)存储与查询,兼顾精度与兼容性:
✅ 正确做法:使用毫秒级时间戳
from datetime import datetime
from qdrant_client import QdrantClient
from qdrant_client.models import Filter, FieldCondition, Range
# 初始化客户端(请替换为实际连接参数)
qdrant_client = QdrantClient("http://localhost:6333")
# 构造目标时间(注意:务必使用 timezone-aware datetime 或明确按 UTC 处理)
dt = datetime(2024, 2, 22, 10, 4, 28, 658690)
# 方案一:转为毫秒级时间戳(推荐 —— 避免浮点误差,适配整型字段)
timestamp_ms = int(dt.timestamp() * 1000) # → 1708596268658
# 构建过滤器(使用 models.Filter 推荐写法,更健壮、类型安全)
filter_condition = Filter(
must=[
FieldCondition(
key="timestamp",
range=Range(gte=timestamp_ms)
)
]
)
# 执行查询(使用 query_points 或 scroll,取决于场景)
results = qdrant_client.scroll(
collection_name="your_collection",
scroll_filter=filter_condition,
limit=100
)? 提示:若你使用 query() 方法(如 search 或 recommend),请将 scroll_filter 替换为 filter= 参数;scroll 更适用于纯过滤分页场景。
⚠️ 关键注意事项
- 存储一致性:插入数据时,timestamp 字段必须已存为整型(如 1708596268658),而非字符串 "2024-02-22T10:04:28.658Z" 或 datetime 对象,否则过滤将失效或报错。
-
时区处理:Python datetime.now() 默认为本地时区,建议统一使用 UTC 时间:
from datetime import timezone dt_utc = datetime(2024, 2, 22, 10, 4, 28, 658690, tzinfo=timezone.utc) timestamp_ms = int(dt_utc.timestamp() * 1000)
- 精度选择:秒级(int(dt.timestamp()))适用于粗粒度过滤;毫秒级(*1000)更适合日志、事件流等高频场景。
-
字段类型验证:可通过 get_collection() 检查 timestamp 字段是否为 integer 或 float 类型:
collection_info = qdrant_client.get_collection("your_collection") print(collection_info.config.params.vectors) # 查看 payload schema(需结合 schema 定义)
? 后续展望
Qdrant v1.8.0 将正式支持原生 datetime 类型字段及 ISO 8601 字符串解析(如 "2024-02-22T10:04:28.658Z"),届时可直接使用字符串格式过滤,无需手动转换。但为保障生产环境稳定性与向前兼容性,当前仍强烈建议坚持时间戳整型方案。
立即学习“Python免费学习笔记(深入)”;
总结:时间即数字——在 Qdrant 现行架构下,将 datetime 规范为毫秒时间戳,是高效、可靠、零依赖的过滤实践标准。










