milvus-io / milvus-sdk-java

Java SDK for Milvus.
https://milvus.io
Apache License 2.0
380 stars 153 forks source link

No found insertIds, please check your requests #984

Open mmahao opened 1 month ago

mmahao commented 1 month ago

java的sdk,版本2.2.13

image image image

这块调用的时候,有点问题 1.当向量库里面有数据的时候,数据是删掉了,但是报错:No found insertIds, please check your requests 2.当向量库里面没有数据的时候,返回的delCount也是1,也是报错:No found insertIds, please check your requests

这个问题,不知道是不是因为bug引起的,如果有什么好的解决办法,请提供一下,多谢🙏🙏🙏

mmahao commented 1 month ago

这块的话因为我是delete操作,并不是insert,所以return R.success(DeleteResponse.builder().deleteIds(resultWrapper.getInsertIDs()).build());是不是调用错方法了。

mmahao commented 1 month ago

image

yhmo commented 1 month ago

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" https://github.com/milvus-io/milvus-sdk-java/blob/3e8c58f7b2a3e314a8f3b8644ef3cb4b2bedf418/src/main/java/io/milvus/response/MutationResultWrapper.java#L69

我的建议是用原生的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());
        }
mmahao commented 1 month ago

还有个问题,向量库里面没有数据的时候,最后返回的删除count还是1,这个不确定是bug还是原本的设计。

我这边准备直接手动调用String expr = VectorUtils.convertPksExpr(requestParam.getPrimaryIds(), wrapper);最后就不调用resultWrapper.getInsertIDs()了,这样应该就ok了

mmahao commented 1 month ago

解决了,放弃String expr = VectorUtils.convertPksExpr(requestParam.getPrimaryIds(), wrapper);

image

yhmo commented 1 month ago

delete()返回的那个delete count没有什么用,server端只是简单地把要删除的id统计一下返回给客户端。实际真正删除了多少,在返回的时候是不知道的,因为是异步执行。

xiaofan-luan commented 1 month ago

java的sdk,版本2.2.13

image image image

这块调用的时候,有点问题 1.当向量库里面有数据的时候,数据是删掉了,但是报错:No found insertIds, please check your requests 2.当向量库里面没有数据的时候,返回的delCount也是1,也是报错:No found insertIds, please check your requests

这个问题,不知道是不是因为bug引起的,如果有什么好的解决办法,请提供一下,多谢🙏🙏🙏

目前都是deleteByID,为啥还要getID呢?Milvus本身也不知道删除了哪些ID的,你GetInsertID自然就会报错。