向量搜索中的过滤技术完全指南

向量搜索中的过滤技术完全指南

💡 原文英文,约3900词,阅读约需14分钟。
📝

内容提要

本文介绍向量搜索中的过滤技术。以电商搜索为例,说明仅靠语义搜索不够,需结合元数据过滤才能精准匹配。Qdrant采用可过滤向量索引,通过添加特殊链接解决预过滤和后过滤的缺陷。文章还讲解了滚动查询、嵌套过滤、载荷索引及多租户等用法,并建议浮点数用范围过滤。

🔎

延伸解读

预过滤与后过滤的局限

文章指出,预过滤先按元数据缩小数据集再搜索,但在低基数过滤时可能破坏HNSW图的连接,导致搜索路径断裂;后过滤先进行向量搜索再过滤,可能丢弃大量结果,浪费计算资源,且无法找回初始结果集之外的项。Qdrant的可过滤向量索引通过添加特殊链接来缓解这些问题。

载荷索引如何影响查询性能

文章强调,载荷索引是辅助数据结构,能加速过滤检索。Qdrant的查询规划器会根据过滤基数选择策略:基数低于阈值时使用载荷索引,高于阈值时使用可过滤向量索引。若不创建载荷索引,Qdrant可能选择次优计划,导致搜索缓慢或精度下降。

多租户场景下的索引策略

文章提到,多租户应用常见错误是为每个租户创建独立集合,这会快速耗尽集群资源,可能引发OOM错误和性能下降。Qdrant支持在单个集合中通过将字段标记为is_tenant来隔离租户数据,并使用租户索引提高检索效率,从而避免资源浪费。

浮点数过滤的注意事项

文章建议,过滤浮点数时避免精确匹配,因为浮点数舍入可能导致逻辑相同的值显示不同,例如11.99可能匹配到11.98或12.00。推荐使用范围过滤,如gte和lte设置为11.99,以涵盖微小变化,提高准确性和性能。

❓

Q&A

向量搜索中为什么需要过滤?

仅靠语义搜索可能返回数学上相似但不满足具体条件的结果,例如搜索1000美元以下的笔记本电脑,却可能显示超过1000美元的型号。通过添加元数据过滤(如价格范围),可以确保结果符合指定特征,提高搜索精度。

Qdrant的可过滤向量索引是如何工作的?

Qdrant在向量索引中为被过滤掉的数据点添加特殊链接(基于类别的连接),使搜索图保持连通,从而在过滤后仍能遍历到最近邻。这种方法结合了预过滤和后过滤的优点,既保持向量搜索的速度,又实现精确过滤。

预过滤和后过滤各有什么缺点?

预过滤先根据元数据缩小数据集再搜索,但在大数据集上会破坏HNSW图的连接,导致搜索路径碎片化,降低准确性。后过滤先进行向量搜索再过滤,但会丢弃大量结果,浪费计算资源,且可能遗漏不在初始结果中的目标项。

Qdrant中如何使用嵌套过滤查询数组中的对象?

使用嵌套条件(nested condition),指定数组键和内部过滤条件。例如,查询饮食中包含“肉”且“喜欢”为true的恐龙,需使用nested过滤器,确保条件作用于同一个数组元素,而不是跨元素匹配。

为什么建议为元数据字段创建载荷索引?

载荷索引作为辅助数据结构,能加速过滤检索,帮助评估过滤基数,从而选择最优查询策略。没有索引时,Qdrant可能选择次优搜索方式,导致搜索缓慢或结果不准确。索引还能减少计算资源消耗,提升扩展性。

在多租户场景下,如何避免为每个租户创建独立集合?

可以在同一个集合中,将用户ID字段标记为租户(is_tenant: true),并创建租户索引。这样不同租户的数据可以在同一集合中隔离和高效检索,避免因创建过多集合导致资源耗尽和性能下降。

过滤浮点数时应该注意什么?

浮点数精确匹配可能不可靠,因为舍入误差可能导致逻辑相同的值显示不同。建议使用范围过滤(range filter)代替精确匹配,例如设置gte和lte为同一个值,以包含微小变化,提高准确性和性能。

🏷️

标签

➡️

继续阅读