Qdrant是一款开源向量数据库,专门用来存储高维向量并支持相似度检索。在实际业务里,单纯依靠向量之间的距离往往不能满足需求,因为语义相近的内容可能属于不同类目或不同用户。这时候就需要把结构化字段条件和向量检索结合在一起,也就是Payload与向量混合搜索。

什么是Payload与向量混合搜索
Payload在Qdrant里指附着在向量点上的结构化数据,比如商品的价格、类目、上架时间,或者用户的年龄、城市、会员等级。这些字段以JSON形式存在,不参与向量计算,但可以在查询时作为过滤条件使用。向量搜索负责找语义相近的内容,Payload过滤负责限定范围,两者结合就能精准召回。
混合搜索的核心价值在于控制召回质量。例如一个电商场景,用户以图搜货,向量模型找出外形相似的商品,但运营只希望展示库存大于零且处于促销期的商品。如果先向量检索再人工剔除,既浪费算力又容易漏判;用Payload过滤则能在检索入口直接约束结果集,效率更高。
Qdrant过滤查询的基本写法
在Qdrant的查询接口中,filter字段用来描述Payload条件,vector或query_vector用来描述向量。一次典型请求会把二者放在同一个请求体里。下面是一个简化结构说明:
| 参数 | 作用 | 示例 |
|---|---|---|
| filter | 定义Payload匹配规则 | must中写price大于100 |
| vector | 传入查询向量 | 512维浮点数组 |
| limit | 返回条数 | 10 |
| with_payload | 是否回传Payload | true |
filter内部常用must、should、must_not三类逻辑。must表示全部满足,should表示满足其一即可,must_not表示都不能满足。这种结构类似布尔检索,只是作用在Payload而非正文关键词上。
例如要查类目为book且评分不低于4.5的商品,就把类目等于book写进must,评分大于等于4.5也写进must。若还想在结果里优先出现包邮商品,可以把free_shipping等于true放进should,但注意should在must存在时只影响排序权重而非强制门槛。
数值、标签与范围的常见过滤
数值类字段直接用range条件,比如创建时间在某个区间,或者价格低于某值。标签类字段常用match关键字,精确匹配字符串或整数标签。Qdrant也支持match任意值集合,一次过滤多个类目。
举一个例子,内容平台想推荐给北京用户且标签包含科技或财经的文章。查询时filter的must里放city等于北京,should里放tag match科技与tag match财经。向量部分用用户历史点击文章的均值向量。这样召回的文章既地域对齐,又主题相关,还兼顾了语义延展。
预过滤与后过滤的区别
Qdrant提供两种执行顺序。预过滤指先按Payload筛掉不符合的点,再在剩余集合里做向量搜索,适合过滤后数据量仍较大的情况,能保证向量检索在有效范围内进行。后过滤指先向量召回再剔除不符Payload的点,适合过滤条件极严格、命中很少的场景,避免预过滤导致无结果。
选择哪种方式要看数据分布。如果Payload条件能砍掉九成数据,预过滤明显省资源;如果条件只是微调,比如会员优先,后过滤更灵活。实际项目中常通过压测观察延迟和召回率再定型。
混合搜索的落地建议
在推荐系统里,可以用用户向量做兴趣召回,同时用Payload锁定物品状态与曝光频控,防止推已购或下架品。在风控场景,用行为序列向量找相似案件,再用Payload限定时间窗与渠道,提升排查效率。
写查询时建议把稳定强约束放must,弱偏好放should,向量维度保持和入库时一致。另外Payload索引要提前建好,否则过滤会退化为全量扫描。做好这些,Qdrant的Payload与向量混合搜索就能稳定支撑业务检索。