AI开发-python-milvus向量数据库(2-9 -milvus-数据更新)

[复制链接]
发表于 2026-2-21 08:31:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
【Milvus 实战】利用 upsert 接口高效更新向量数据库中的数据

 在基于 Milvus 向量数据库的开发中,数据更新是高频操纵场景。本文将通过完备的代码示例,具体讲授怎样利用 PyMilvus 客户端的upsert接口实现 Milvus 聚集(Collection)中数据的精准更新,并验证更新效果,同时办理开发中常见的版本兼容告诫题目。 一、场景配景

 Milvus 作为主流的向量数据库,提供了upsert(插入 / 更新)接口 —— 当数据 ID 已存在时实行更新操纵,ID 不存在时实行插入操纵,这一特性非常得当须要对已有向量数据举行字段更新的场景。本文以更新向量数据的color字段为例,演示完备的更新流程。 二、完备代码实现

 代码告急分为以下几个核心步调: 

  • 毗连 Milvus 服务端
  • 验证聚集加载状态
  • 查询更新前的数据(基准对比)
  • 实行数据更新操纵
  • 查询更新后的数据(验证更新效果)

三、核心操纵详解:数据更新(upsert)

 upsert 接口的核心特性

 upsert是 Milvus 的核心数据操纵接口,其运动由数据的id字段决定: 

  • 若id在聚集中已存在:更新该 ID 对应的全部指定字段(如本文中的vector和color);
  • 若id在聚集中不存在:插入这条新数据。

四、留意事项

 

  • 数据落盘延长:Milvus 写入数据存在毫秒级延长,若更新后立即查询未看到效果,可通过time.sleep(1)短暂休眠后再查询;
  • ID 的唯一性:id是 Milvus 聚集的主键(主键字段不可修改),必须通过id定位待更新的记录;
  • 字段兼容性:更新的字段需与聚集的 Schema 界说划一(如vector维度、color字段范例),否则会报错;
 五、总结

 本文通过完备的实战代码,演示了 Milvus 向量数据库中基于upsert接口的数据更新操纵,核心要点如下: 

  • upsert接口是 Milvus 实现数据更新的核心方式,通过 ID 匹配实现 “存在即更新,不存在即插入”;
  • 更新操纵需先界说包罗目的 ID 和新字段值的数据列表,再调用upsert接口实行;
  • 实行更新后,需重新查询数据验证更新效果,须要时可添加短暂休眠确保数据落盘。
 该方法实用于全部须要更新 Milvus 向量数据的场景,如商品向量属性更新、用户特性向量革新等,是 Milvus 开发中必备的核心技能。 代码如下:
  1. # 过滤 pymilvus 依赖的 pkg_resources 废弃警告(setuptools≥81 版本触发)
  2. # 目的是消除版本兼容带来的无关警告,让控制台输出更整洁
  3. import warnings
  4. warnings.filterwarnings("ignore", message=".*pkg_resources is deprecated as an API.*")
  5. from pymilvus import MilvusClient
  6. import time
  7. client = MilvusClient(
  8.     uri="http://192.168.211.128:19530",
  9.     token="root:Milvus"
  10. )
  11. #集合名称
  12. collection_name = "insert_collection"
  13. # 验证加载状态
  14. load_state = client.get_load_state(collection_name=collection_name)
  15. print("----查看加载状态----")
  16. print(load_state)
  17. # 10. 查询数据
  18. all_data = client.query(
  19.     collection_name=collection_name,
  20.     filter="id >= 0",
  21.     output_fields=["id", "vector", "color"],
  22.     limit=1  # 使用实际数据量作为limit
  23. )
  24. # 11. 打印查询结果
  25. print(f"\n集合 {collection_name} 中共有 {len(all_data)} 条数据:")
  26. for idx, data in enumerate(all_data):
  27.     print(f"\n第{idx+1}条:")
  28.     print(f"ID: {data['id']}")
  29.     print(f"向量: {data['vector']}")
  30.     print(f"颜色: {data['color']}")
  31. #修改数据
  32. data=[
  33.     {"id": 0, "vector": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], "color": "black_2"}
  34. ]
  35. res = client.upsert(
  36.     collection_name='insert_collection',
  37.     data=data
  38. )
  39. print(res)
  40. # 短暂休眠(Milvus数据写入有延迟,确保数据落盘后再查询)
  41. #time.sleep(1)
  42. all_data = client.query(
  43.     collection_name=collection_name,
  44.     filter="id >= 0",
  45.     output_fields=["id", "vector", "color"],
  46.     limit=1  # 使用实际数据量作为limit
  47. )
  48. print(f"\n集合 {collection_name} 中共有 {len(all_data)} 条数据:")
  49. for idx, data in enumerate(all_data):
  50.     print(f"\n第{idx+1}条:")
  51.     print(f"ID: {data['id']}")
  52.     print(f"向量: {data['vector']}")
  53.     print(f"颜色: {data['color']}")
复制代码
输出如下:
----检察加载状态----
{'state': }

聚集 insert_collection 中共有 1 条数据:

第1条:
ID: 0
向量: [-0.6199544, 0.4479437, -0.17493895, -0.42480302, -0.8648453]
颜色: black_1
{'upsert_count': 1}

聚集 insert_collection 中共有 1 条数据:

第1条:
ID: 0
向量: [-0.6199544, 0.4479437, -0.17493895, -0.42480302, -0.8648453]
颜色: black_2
更多学习资料尽在老虎网盘资源:http://resources.kittytiger.cn/  老虎网盘资源
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表