载荷索引是什么
Qdrant 的过滤条件作用在载荷(payload)字段上。对高频过滤的字段建载荷索引后,检索能先快速定位符合条件的候选集合,再做向量比较;keyword、integer、datetime、geo 等类型要建对应类型的索引。不建索引过滤依然能工作,但数据量上来后延迟会明显恶化,这类退化通常没人立刻发现。
基本信息
| 索引类型 | keyword、integer、float、datetime、bool、geo 等 |
|---|---|
| 创建方式 | create_payload_index 指定字段名与字段类型 |
| 查看方式 | 读取集合信息里的 payload_schema 字段 |
| 收益边界 | 字段基数低(如布尔)时索引收益有限 |
典型使用场景
- 多租户过滤:tenant 字段几乎每次查询都带,必须建索引
- 来源筛选:按来源或文档类型过滤,字段基数适中收益明显
- 时间窗口:按更新时间过滤近期文档,datetime 索引加速范围判断
- 状态过滤:只检索已发布内容,配合 must_not 排除废弃文档
- 性能排查:检索延迟升高时先确认过滤字段有没有建索引
建载荷索引
建载荷索引
client.create_payload_index(collection_name="kb", field_name="source",
field_schema=models.PayloadSchemaType.KEYWORD)
client.create_payload_index(collection_name="kb", field_name="updated_at",
field_schema=models.PayloadSchemaType.DATETIME)
# 字段类型选错(如时间戳建成 keyword)过滤仍能跑,但用不上索引加速
print(client.get_collection("kb").payload_schema) # 确认索引已生效
字段类型与索引选择
| 字段类型 | 索引 schema | 典型字段 |
|---|---|---|
| 分类标签 | keyword | 租户、来源、文档类型 |
| 数值区间 | integer 或 float | 版本号、页码范围 |
| 时间戳 | datetime | 更新时间窗口过滤 |
| 布尔开关 | bool | 是否公开、是否已发布 |
索引针对过滤字段而非全部 payload:字段基数低(如布尔)时索引收益有限,把长文本字段建成 keyword 索引反而会增加写入与存储成本。
建索引是后台任务:数据量大时构建要花时间,上线前预留窗口,并在完成后用同一条带过滤的查询对比延迟,确认收益真实存在。
过滤字段的选择性决定收益大小:几乎过滤不掉数据的条件(如命中九成以上记录)建索引帮助有限,真正需要索引的是能把候选集缩小一个量级以上的字段。