检索接口怎么用
Milvus 的检索接口需要给出查询向量、返回条数、输出字段与检索参数,过滤条件写在表达式中并作用在标量字段上,可与向量检索组合使用。批量检索时把多个查询向量一次性传入即可返回多组结果,比分多次调用更省往返开销。
基本信息
| 必需参数 | 集合名、查询向量、返回条数 |
|---|---|
| 常用参数 | 输出字段、检索参数、过滤表达式 |
| 过滤对象 | 标量字段:来源、版本、租户、时间 |
| 前提 | 过滤字段建议建标量索引以提升带条件检索性能 |
基础检索
基础检索
res = client.search(
collection_name="kb",
data=[query_vec], # 批量为多个向量
limit=10,
output_fields=["source", "title"],
search_params={"metric_type": "COSINE", "params": {"ef": 64}},
)带过滤表达式
带过滤表达式
res = client.search(
collection_name="kb", data=[query_vec], limit=10,
filter='source == "handbook" && version >= 2',
output_fields=["source", "version"],
)使用要点
- 只取需要的输出字段:整段长文本会显著增加网络与序列化开销
- 过滤表达式语法与 SQL 不同,使用双等号与逻辑运算符,拼错会直接报错
- 检索前确认集合已加载,未加载会返回明确的错误提示
- 按需设置检索参数,图索引的候选队列长度可直接在查询时调整
- 分页取结果时注意深分页的开销,必要时改用游标式设计
表达式与字段类型
| 字段类型 | 可用写法 | 注意 |
|---|---|---|
| 字符串 | 等值或集合匹配 | 区分大小写 |
| 数值 | 比较与范围 | 整数与浮点写法一致 |
| 布尔 | 直接判断 | 适合标记类字段 |
| 组合条件 | 逻辑与或非 | 括号提升可读性 |
常见问题
- 返回结果条数不足:过滤条件过严,与向量检索叠加后候选被筛空
- 检索报集合未加载:遗漏加载步骤或加载失败
- 延迟异常:输出字段过多或过滤字段未建标量索引
- 结果与预期不符:度量方式与写入时不一致
过滤字段先建标量索引;带过滤检索的性能与过滤集大小强相关,条件越严越要先评估最差分布下的返回条数。
批量检索与性能
- 多个查询向量一次传入比分多次调用更省往返开销,但要控制单次批量大小
- 只取必要字段能显著减少网络传输,长文本字段尤其明显
- 带过滤检索的耗时与过滤集大小相关,过滤越严越要先评估
- 把每次检索的耗时与召回条数打点,延迟恶化时能快速定位
- 写入后立即检索可能因数据落盘延迟而查不到,需接受最终一致