现场是这样的。pymilvus 2.4.4,collection 里加了 SPARSE_FLOAT_VECTOR 字段,建索引时照 dense 的写法填 IVF_FLAT,报 index type not supported for sparse vector field,插入也一起失败。

中间走过弯路,把「建索引与插入顺序颠倒,先写数据再改索引」当成主因,改完现象没变。

这类报错背后常见的原因有几处,逐个排除就行。稀疏向量只支持倒排类索引,不认 IVF 系列;metric_type 用了 L2,稀疏字段只接受 IP;pymilvus 与服务端版本不一致,枚举值被序列化成字符串。

动手时先确认字段类型与索引现状

python -c "from pymilvus import Collection;c=Collection('docs');print([(f.name,str(f.dtype)) for f in c.schema.fields])"

然后用倒排索引重建稀疏字段

python -c "from pymilvus import Collection;c=Collection('docs');c.create_index('sparse_vec',{'index_type':'SPARSE_INVERTED_INDEX','metric_type':'IP'})"

再往下加载集合并做一次稀疏检索

python -c "from pymilvus import Collection;c=Collection('docs');c.load();print(c.search([{1:0.9,3:0.4}],'sparse_vec',{'metric_type':'IP'},limit=5))"

剩下的就是核对索引状态

python -c "from pymilvus import Collection;print(Collection('docs').indexes[1].params)"

隔了一天再看,现象没变,说明不是偶发。

那几天正好在做别的变更,先把时间线对齐才敢动手。

怎么算真的好了,看的是同一批现象。索引状态为 Finished,稀疏检索能返回 5 条,分数随命中词权重单调上升。

稀疏字段可选的索引类型比稠密少得多,照抄 dense 的配置一定会被服务端拒掉。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189