报错是这么冒出来的。从业务库删掉一篇文章后,检索仍能搜到它的片段,用户点进去发现页面已经 404。
中间走过弯路,把「删除是软删除,需要合并后才真正生效」当成主因,改完现象没变。
这类报错背后常见的原因有几处,逐个排除就行。只删了业务库,没有同步删除向量库记录。另一种情况是删除表达式字段名或取值类型不对。
不容易想到的是,多副本或缓存里还保留旧结果。
第一件事是按文档 id 精确删除向量
client.delete('docs', filter='doc_id == "1024"')
再往下删除后统计剩余数量做校验
python -c "print(client.query('docs', filter='doc_id == \"1024\"', limit=5))"
接着对检索结果做一次存在性过滤
docs = [d for d in hits if exists(d.metadata['doc_id'])]
剩下的就是把删除动作做进同一条消息队列
python -c "print('publish delete event')")
别只看报错消失,验证要多做一步。被删文档的片段不再出现在检索结果里,数量统计与业务库一致,用户不会再点到空页面。
这里还有个坑。删除接口返回成功不代表立刻可查,多数向量库是标记删除,查询侧加一层存在性过滤能兜住这段窗口期。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。