关于插入数据到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': }
集合 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/ 老虎网盘资源
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |