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