元数据过滤是什么
元数据过滤把可枚举的筛选条件(产品线、版本、语言、密级、生效日期)随着片段一起写进向量库的 payload 或标量字段,检索时先按条件缩小范围再算距离。它解决两类问题:多版本文档混检导致答非所问,以及无关领域文档挤占候选位。要让过滤真正加速,高频过滤字段必须建索引,否则过滤只能退化成逐条扫描,延迟不降反升。
基本信息
| 承载位置 | Qdrant 的 payload、Milvus 的标量字段、pgvector 的普通列 |
|---|---|
| 过滤索引 | 高频字段建 payload 索引或标量索引 |
| 过滤下推 | 支持在向量检索前先做条件筛选可减少扫描量 |
| 字段设计 | 短、可枚举、基数可控,长文本不要放进来 |
| 组合方式 | 等值、范围(日期)、集合包含(in) |
典型使用场景
- 多版本并存的技术文档:按 version 过滤,只检索当前生效版本
- 多租户隔离:按 tenant 过滤,防止跨租户内容互相召回
- 权限控制:按密级与部门过滤,避免越权内容进入上下文
- 时间敏感问答:按生效日期过滤,排除已废止条款
- 提高精度:按语言或产品线过滤,减少跨领域噪声候选
写入带元数据的片段
写入带元数据的片段
store.upsert([{
'id': 'doc-101#chunk-3', 'vector': vec,
'payload': {'product': 'router-A', 'version': 'v2.3',
'lang': 'zh', 'updated': '2026-08-01', 'tenant': 't-42'}}])查询时过滤
查询时过滤
hits = store.search(q_vec, top_k=10,
filter={'product': 'router-A', 'version': 'v2.3'})
# 过滤字段必须与写入时的大小写、格式完全一致,否则筛出空集字段设计建议
| 字段 | 类型 | 注意事项 |
|---|---|---|
| product / version | 短字符串 | 与源系统取值域对齐,避免同义写法 |
| tenant | 短字符串或整型 | 必须过滤,不能依赖应用层事后剔除 |
| updated | 日期 | 范围过滤,注意时区与格式统一 |
| 密级 | 枚举 | 取值域收窄,别名会造成越权 |
能被过滤的内容就等于能被枚举:密级、租户这类字段的取值域要严格控制,字段值写错会直接造成越权检索,比性能问题严重得多。