将时间或摄像头 ID 过滤与向量搜索结合使用,需要在向量相似性搜索之前或期间使用元数据约束来缩小数据集。这种方法确保结果在上下文(基于时间和摄像头)上相关,并且在语义上与查询相似。例如,在视频监控系统中,您可以搜索“一辆红色汽车”(向量相似性),但只想要来自摄像头 3,时间在下午 2:00 到下午 4:00 之间的结果。系统首先使用元数据(摄像头 ID 和时间戳)过滤数据集,然后在子集上执行向量搜索,从而平衡效率和相关性。
为了实现这一点,像 Pinecone、Milvus 或 Elasticsearch 这样的数据库通常将向量与结构化元数据(例如,时间戳,摄像头 ID)一起存储。在查询期间,数据库首先应用元数据过滤器,从而减少搜索空间。例如,如果您查询“戴帽子的人”,系统可能会过滤掉与摄像头 5 相关的所有向量以及过去一小时的时间戳。然后,仅使用余弦相似度等距离度量,将这些过滤后的向量与查询向量进行比较。这种两步过程最大限度地减少了计算开销,因为向量比较开销很大,并且首先进行过滤可以避免扫描整个数据集。一些数据库通过索引元数据(例如,时间戳的 B 树,摄像头 ID 的哈希索引)并使用近似最近邻 (ANN) 算法进行向量搜索来进一步优化,从而即使在大型数据集的情况下也能确保快速检索。
开发人员可以通过使用包含向量和过滤器参数的结构化查询来实现这一点。例如,使用带有向量数据库客户端的 Python,一个查询可能看起来像
results = index.query(
vector=query_embedding,
filter={
"camera_id": {"$eq": 3},
"timestamp": {"$gte": "2023-10-01T14:00:00", "$lte": "2023-10-01T16:00:00"}
},
top_k=10
)
在这里,数据库有效地检索与 query_embedding
相似的前 10 个向量,这些向量也符合摄像头和时间约束。挑战包括确保元数据索引得到优化(例如,将基于时间的数据划分为每小时/每天的块),以及调整过滤器严格性和召回率之间的平衡。适当的索引和分区策略对于保持低延迟至关重要,尤其是在处理像实时视频分析或具有时间敏感促销的电子商务产品搜索这样的高吞吐量系统时。