内容提要
本文介绍向量搜索中的过滤技术。以电商搜索为例,说明仅靠语义搜索不够,需结合元数据过滤才能精准匹配。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为同一个值,以包含微小变化,提高准确性和性能。