这个坑值得记一笔。重建知识库时先 delete_collection 再建同名集合,建好后立刻 insert,查询却能返回上一版内容,Milvus 2.4 里 collection 与 alias 同时存在。
刚开始盯着「客户端缓存了 collection id,重建后还用旧句柄」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。删除是异步的,建同名集合时旧数据还没清完;用的是 alias,删掉的是实体集合,别名仍指向它;插入的数据带旧主键,被当成更新覆盖而不是新增。
上来先看别名到底指向哪个集合
python -c "from pymilvus import connections,utility;connections.connect(host='127.0.0.1',port='19530');print(utility.list_aliases())"
再往下删除后轮询确认集合真的不存在
python -c "from pymilvus import utility;print(utility.has_collection('kb'))"
然后重建后重新 load 并读实体数
python -c "from pymilvus import Collection;c=Collection('kb');c.load();print(c.num_entities)"
末了按主键前缀核对没有旧数据
python -c "print([x for x in ['v2_1','v1_9'] if not x.startswith('v2')])"
别只看报错消失,验证要多做一步。has_collection 在删除后返回 False,重建集合的 num_entities 与本次插入条数一致,查询结果里不含旧版本主键前缀。
生产上不要删同名集合,改成新名字加别名切换,出问题一条命令就能切回去。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
