数据插入完成后立刻检索,报 index not found,等一会儿再试又能查到,但结果数量不稳定。
一开始怀疑是「索引类型与字段类型不匹配,创建失败但没检查」,查了一圈,方向不对。
排查方向其实有限,先把可能性排一排。建索引是异步任务,创建后要等完成。少数情况下是先在空集合上建索引,插入后没有触发构建。
还有一种情况,集合被释放后索引状态丢失。
建索引后查询构建进度
client.describe_index('docs', 'embedding')
接着等待索引构建完成再检索
while client.describe_index('docs','embedding').state != 'Finished': time.sleep(2)
随后按字段类型选择正确的索引
client.create_index('docs', 'embedding', {'index_type':'HNSW','metric_type':'COSINE','params':{'M':16,'efConstruction':200}})
剩下的就是加载集合后再发起检索
client.load_collection('docs')
这次没动代码,只在配置和运行环境上找原因。
改完先别撤,确认这几项。索引状态显示完成,检索返回稳定的结果条数,写入后立刻查询也不会漏数据。
容易忽略的是,插入后不 flush 时数据还在内存缓冲里,检索结果会少一截,批量导入后要显式 flush 一次再建索引。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。