首页/AI/RAG 与向量库速查/Qdrant 过滤条件写法

Qdrant 过滤条件写法

Qdrant 过滤器由 must / should / must_not / min_should 组合子条件:MatchValue、MatchAny、Range、HasId 等;嵌套字段用 key 路径访问,多租户可用 should 组合属主列表。

RAG 与向量库速查AI更新于 2026-10-13

Qdrant 过滤器是什么

Qdrant 的过滤条件由 must、should、must_not 与 min_should 组合而成:MatchValue 做精确匹配、MatchAny 命中列表之一、Range 与 DatetimeRange 判断区间、HasId 按主键筛选,嵌套字段用点号路径访问。多租户场景常用 should 组合属主列表,实现「只看自己有权限的数据」这类过滤,无需为每个租户单独建集合。

基本信息

条件组合must 全满足、should 至少一个、must_not 排除
常用匹配MatchValue、MatchAny、Range、DatetimeRange、HasId
嵌套字段key 用点号路径,如 meta.lang
性能前提被过滤字段建载荷索引,否则退化为逐条判断

典型使用场景

  • 权限隔离:按租户或部门过滤,保证检索结果不越权
  • 状态过滤:只检索已发布、未过期的文档,排除草稿与废弃版本
  • 版本精确命中:按产品版本号过滤,避免不同版本文档串答
  • 时间窗口:只检索近半年更新过的资料,控制时效性
  • 多值标签:用 MatchAny 匹配一组标签中的任意一个,支持跨类目问答

组合过滤条件

组合过滤条件
flt = models.Filter(
    must=[models.FieldCondition(key="lang", match=models.MatchValue(value="zh"))],
    should=[models.FieldCondition(key="tenant", match=models.MatchAny(any=["t1", "t2"])),
            models.FieldCondition(key="public", match=models.MatchValue(value=True))],
    must_not=[models.FieldCondition(key="status", match=models.MatchValue(value="deprecated"))],
)
# should 默认至少命中一个;需要更严格时用 min_should 指定下限
# 过滤字段记得建载荷索引,否则数据量上来后延迟明显恶化

组合子句语义

子句语义易错点
must全部条件都要满足条件叠加过多会让结果为空
should至少命中一个条件与 must 同时出现时是「且」的关系
min_shouldshould 命中数的下限未设置时默认只要求命中一个
must_not排除命中该条件的点与其他子句叠加时优先级容易理解错
先在控制台的过滤器面板里验证条件表达式,确认返回数量符合预期,再固化到代码里,能省掉大量语法试错的时间。
过滤与向量的执行顺序会影响效果:过滤条件很严格时,先过滤再检索能避免把算力花在会被排除的数据上。
过滤条件写完先统计命中数量:返回为零说明条件写错或字段名不匹配,返回为全量说明过滤没生效,两种情况都会让检索结果看起来正常但实际不对。

易错点

  • must_not 与 should 混用时优先级理解错,过滤结果与预期相反
  • 字符串大小写敏感(MatchValue 默认精确匹配),拼写差异导致漏检
  • 过滤字段未建载荷索引,数据量增大后检索延迟从毫秒级恶化
  • 把权限过滤写在前端而不是检索阶段,越权数据仍可能被召回

数据来源与参考

  • Qdrant 官方文档(Filtering / Field conditions)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌