这个坑值得记一笔。增量同步文档时插入报主键已存在,导致整批失败,改成删除再插入又会出现短暂的空窗期。

刚开始盯着「批量写入里同一批就有重复 id」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。用了 insert 而不是 upsert,重复主键直接报错;主键由内容哈希生成,内容没变时必然重复;自动生成主键的字段被手工赋值。

动手时先改用量级更合适的 upsert 接口

client.upsert('docs', data)

随后写前对批内 id 去重

python -c "print(len(rows), len({r['id'] for r in rows}))"

接着确认主键字段定义与生成规则

python -c "print([f.name for f in client.describe_collection('docs')['fields']])"

末了分批写入并统计成功条数

python ingest.py --batch 500 --mode upsert

怎么算真的好了,看的是同一批现象。重复同步不再报错,文档数量与源数据一致,检索结果里没有重复片段。

upsert 是按主键覆盖,主键如果包含时间戳就会一直新增而不是更新,同步前先想清楚主键该由哪些字段组成。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189