如何将Python开发中的Milvus向量数据库数据高效插入collection?

摘要:关于插入数据到collection以及查询collection中的数据有如下几个知识点需要了解。 1. flush 和 load_collection 的区别 操作作用必要性 flush() 将内存中的数据刷入持久化存储,更新查询索引 必须
关于插入数据到collection以及查询collection中的数据有如下几个知识点需要了解。 1. flush 和 load_collection 的区别 操作作用必要性 flush() 将内存中的数据刷入持久化存储,更新查询索引 必须(query 查询依赖) load_collection() 将集合数据加载到查询节点内存 显式调用更稳妥(部分场景 Milvus 会自动加载) 2. 自动刷新机制 Milvus 默认会定期自动刷新(约 1 秒),所以如果插入数据后等待几秒再查询,也可能查到数据。但在测试 / 实时查询场景下,手动调用 flush 是最可靠的方式。 3. query 和 search 的区别 query:标量查询,基于字段过滤,必须等待 flush 后才能查到新数据 search:向量检索,Milvus 对其做了优化,未 flush 的数据也可能被检索到(但不保证) 总结 Milvus 插入数据后查询不到,核心原因是数据未完成持久化,而非集合未加载 解决该问题的关键是在插入后执行client.flush()操作 显式调用load_collection()能进一步确保数据可查,是生产环境的最佳实践 理解 Milvus 的内存刷盘机制,能避免大部分 "数据插入成功但查不到" 的问题 这个问题是 Milvus 新手的高频踩坑点,本质是对 Milvus 的性能优化机制不了解。掌握flush操作的使用时机,能让你在使用 Milvus 时少走很多弯路。 看代码: # 过滤 pymilvus 依赖的 pkg_resources 废弃警告(setuptools≥81 版本触发) # 目的是消除版本兼容带来的无关警告,让控制台输出更整洁 import warnings warnings.filterwarnings("ignore", message=".*pkg_resources is deprecated as an API.*") from pymilvus import MilvusClient, DataType # 1. 初始化客户端 client = MilvusClient( uri="http://192.168.211.128:19530", token="root:Milvus" ) # 2. 定义集合名称 collection_name = "insert_collection" # 3. 先删除已存在的同名集合(可选,避免创建失败) if client.has_collection(collection_name): client.drop_collection(collection_name) # 4. 定义集合的结构(Schema),匹配你的数据格式 # 字段说明:id(主键)、vector(5维向量)、color(字符串属性) schema = MilvusClient.create_schema( auto_id=False, # 手动指定id,不自动生成 enable_dynamic_field=True # 允许动态字段(可选,增加灵活性) ) # 添加主键字段 id schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True) # 添加向量字段 vector(5维,浮点型) schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5) # 添加属性字段 color(字符串) schema.add_field(field_name="color", datatype=DataType.VARCHAR, max_length=20) # 5. 定义向量索引(必须,否则无法插入/查询向量) index_params = client.prepare_index_params() index_params.add_index( field_name="vector", # 为vector字段创建索引 index_type="IVF_FLAT", # 基础索引类型,适合新手 metric_type="COSINE", # 余弦相似度 params={"nlist": 128} # 索引参数,默认值即可 ) # 6. 创建集合 client.create_collection( collection_name=collection_name, schema=schema, index_params=index_params ) #向量的内容 data=[ {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"}, {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"}, {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"}, {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"}, {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"}, {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"}, {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"}, {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"}, {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"}, {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"} ] res = client.insert( collection_name=collection_name, data=data ) #插入后的结果 print(res) # Milvus 为了保证高性能,插入的数据不会立刻对查询可见,需要触发 数据段刷新(flush) 操作, # 将内存中的数据持久化到存储并建立查询索引。即使集合显示 Loaded(加载到内存), # 未刷新的数据也无法被 query 语句检索到。 client.flush(collection_name=collection_name) # 加载集合到内存(显式加载,确保数据可查) client.load_collection(collection_name=collection_name) # 验证加载状态(等待加载完成) load_state = client.get_load_state(collection_name=collection_name) print("----查看加载状态----") print(load_state) # 10. 查询数据 all_data = client.query( collection_name=collection_name, filter="id >= 0", output_fields=["id", "vector", "color"], limit=100 # 使用实际数据量作为limit ) # 11. 打印查询结果 print(f"\n集合 {collection_name} 中共有 {len(all_data)} 条数据:") for idx, data in enumerate(all_data): print(f"\n第{idx+1}条:") print(f"ID: {data['id']}") print(f"向量: {data['vector']}") print(f"颜色: {data['color']}") 结果输出: {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]} ----查看加载状态---- {'state': <LoadState: Loaded>} 集合 insert_collection 中共有 10 条数据: 第1条: ID: 0 向量: [0.35803765, -0.6023496, 0.18414013, -0.26286206, 0.90294385] 颜色: pink_8682 第2条: ID: 1 向量: [0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295] 颜色: red_7025 第3条: ID: 2 向量: [0.43742132, -0.55975026, 0.6457888, 0.7894059, 0.20785794] 颜色: orange_6781 第4条: ID: 3 向量: [0.3172005, 0.97190446, -0.36981148, -0.48608947, 0.9579189] 颜色: pink_9298 第5条: ID: 4 向量: [0.44523495, -0.8757027, 0.82207793, 0.4640629, 0.3033748] 颜色: red_4794 第6条: ID: 5 向量: [0.9858251, -0.81446517, 0.6299267, 0.12069069, -0.14462778] 颜色: yellow_4222 第7条: ID: 6 向量: [0.8371978, -0.015764369, -0.31062937, -0.56266695, -0.8984948] 颜色: red_9392 第8条: ID: 7 向量: [-0.33445147, -0.2567135, 0.898754, 0.9402996, 0.5378065] 颜色: grey_8510 第9条: ID: 8 向量: [0.3952472, 0.40002573, -0.5890507, -0.86505026, -0.6140361] 颜色: white_9381 第10条: ID: 9 向量: [0.57182807, 0.24070318, -0.37379134, -0.067269325, -0.6980532] 颜色: purple_4976 更多学习资料尽在老虎网盘资源:http://resources.kittytiger.cn/ 老虎网盘资源