No found insertIds, please check your requests
Opened this issue · 7 comments
这块的话因为我是delete操作,并不是insert,所以return R.success(DeleteResponse.builder().deleteIds(resultWrapper.getInsertIDs()).build());是不是调用错方法了。
MilvusClient里有两个delete接口:
R delete(@nonnull DeleteParam requestParam)
R delete(DeleteIdsParam requestParam)
上面那个是原生的,下面那个是包了一层的所谓高级接口。
实际上你调用这个高级的delete时,内部那个原生的delete是成功返回了的。而当这个高级接口包装一个DeleteResponse返回的时候,是通过MutationResultWrapper.getInsertIDs()想拿id,实际上原生的delete接口并不返回被删除的id,所以这里就会抛出那个"No found insertIds, please check your requests"
我的建议是用原生的delete 接口。要知道的是,delete是个异步操作,当你发送一堆id过去之后,server端只是把delete request推送到pulsar就返回,所以客户端delete接口返回时并不知道到底有多少数据会被删除。所以只要那个R返回SUCCESS就可以认为delete请求以被server端接受,后面会异步处理。
R<MutationResult> deleteR = milvusClient.delete(DeleteParam.newBuilder()
.withCollectionName(COLLECTION_NAME)
.withExpr(ID_FIELD + "==1")
.build());
if (deleteR.getStatus() != R.Status.Success.getCode()) {
throw new RuntimeException("Failed to delete! Error: " + insertRet.getMessage());
}
还有个问题,向量库里面没有数据的时候,最后返回的删除count还是1,这个不确定是bug还是原本的设计。
我这边准备直接手动调用String expr = VectorUtils.convertPksExpr(requestParam.getPrimaryIds(), wrapper);
最后就不调用resultWrapper.getInsertIDs()
了,这样应该就ok了
delete()返回的那个delete count没有什么用,server端只是简单地把要删除的id统计一下返回给客户端。实际真正删除了多少,在返回的时候是不知道的,因为是异步执行。