You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅插入一次却出现重复数据的Milvus Collection问题排查

问题成因
  • 代码未做插入防护:你的代码每次运行都会执行insert_embeddings函数,哪怕Collection已经存在。比如在Streamlit环境中,脚本会因页面交互或刷新多次重新运行,虽然get_milvus_client被缓存,但插入逻辑没有做任何判断,导致同一张图片的Embedding被重复插入。
  • 无唯一字段约束:创建Collection时仅启用了auto_id,但未给filename字段设置唯一约束。Milvus会将相同文件名的插入请求视为新记录,分配新ID存储,最终导致检索时出现重复结果。
解决办法
  1. 仅在Collection不存在时执行创建与插入
    修改代码,先检查Collection是否存在,不存在才创建并执行插入:

    client = get_milvus_client(uri="example.db")
    if not client.has_collection("image_embeddings"):
        client.create_collection(
            collection_name="image_embeddings",
            vector_field_name="vector",
            dimension=512,
            auto_id=True,
            enable_dynamic_field=True,
            metric_type="COSINE",
        )
        insert_embeddings(client)
    
  2. 给filename字段添加唯一约束
    创建Collection时通过Schema定义filename为唯一字段,避免重复插入:

    from pymilvus import FieldSchema, CollectionSchema, DataType
    
    fields = [
        FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
        FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=512),
        FieldSchema(name="filename", dtype=DataType.VARCHAR, max_length=500, is_unique=True)
    ]
    schema = CollectionSchema(fields=fields, metric_type="COSINE")
    
    client = get_milvus_client(uri="example.db")
    if not client.has_collection("image_embeddings"):
        client.create_collection(collection_name="image_embeddings", schema=schema)
        insert_embeddings(client)
    

    这样插入重复文件名时会抛出异常,阻止重复数据写入。

  3. 清理现有重复数据
    如果已经存在重复数据,可以通过以下步骤清理:

    • 查询所有重复的filename记录,保留ID最小的那条,删除其余记录;
    • 或者直接删除现有Collection,重新执行带防护逻辑的插入代码。

内容的提问来源于stack exchange,提问作者Rashad Tockey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:54:54