Milvus数据更新:使用Upsert API实现标量字段批量更新

  1. 最近公司项目遇到一个milvus的技术场景,需要更新Collection的标量字段值,查了一遍官网,发现milvus并不支持直接修改字段值。

  2. 所以一个替代方案是,先获取collection的所有entities,然后逐条判断当前entity是否需要修改字段值,如果需要,根据ID将这条entity删除,然后重新插入修改后的完整entity。

  3. 需要注意的是,根据标量查询的entity有size限制,因此,设置的响应返回字段中不能有向量embedding字段,如果这条entity要更新,需要根据查询到的original_text重新生成嵌入向量。

  4. 值得庆幸的是,milvus提供了这样的API,不需要我们手动删除后再插入,milvus将这两个过程合并在一个API中实现了。

  5. 这个API就是Upsert,下面这个图就是Upsert的工作过程,如果Collection中主键id是自动生成的(Auto),那么Milvus就会先自动生成一个主键id,然后整合接收的entity实体插入数据,然后,根据 Upsert 请求中包含的实体主键值执行删除旧数据操作

  6. 下面是完整java程序

java 复制代码
   @Test
    public void clean(){
    		 // 定义返回字段,这里返回A,B还有主键id字段
        List<String> outputFields = Arrays.asList("id","A","B");  
        String queryExpr = "id > 0";
			 //设置标量查询条件
        QueryReq queryReq = QueryReq.builder()
                .databaseName(CommonConstant.MATERIAL_MILVUS_DATABASE)
                .collectionName(CommonConstant.MATERIAL_NAME_MATCH_COLLECTION)
                .filter(queryExpr)
                .outputFields(outputFields)
                .build();
        QueryResp queryResp = milvusServiceClient.query(queryReq);

        List<QueryResp.QueryResult> results = queryResp.getQueryResults();
        for (QueryResp.QueryResult result : results) {
            long id = (long)result.getEntity().get("id");
            String original_text = (String) result.getEntity().get("A");
            String standard_code = (String) result.getEntity().get("B");


            String treat = treat(manufacturer);
            // 只更新需要修改的entity
            if (!treat.equals(manufacturer)){
                JsonObject jsonObject = new JsonObject();
                List<Float> embedding = embeddingService.postForEmbedding(original_text).getData().get(0).getEmbedding();
                jsonObject.addProperty("id", id);
                jsonObject.add("embedding", gson.toJsonTree(embedding));
                jsonObject.addProperty("A", original_text);
                jsonObject.addProperty("B", standard_code);
       

                List<JsonObject> dataList = Collections.singletonList(jsonObject);
                // 封装UpsertReq 跳进
                UpsertReq upsertReq = UpsertReq.builder()
                        .databaseName(CommonConstant.MATERIAL_MILVUS_DATABASE)
                        .collectionName(CommonConstant.MATERIAL_NAME_MATCH_COLLECTION)
                        .data(dataList)
                        .build();
                UpsertResp upsertResp = milvusServiceClient.upsert(upsertReq);
                log.info(manufacturer + "  处理之后: " + treat );
                System.out.println(upsertResp);

            }
        }
    }

    private String treat(String original){
        String res = original.replaceAll("\\s+", "");
        // 2. 将英文()替换为中文()
        res = res.replace("(", "(").replace(")", ")");
        return res;
    }
相关推荐
夏末蝉未鸣0114 小时前
Windows环境下载并安装milvus
windows·milvus
大傻^3 天前
Spring AI Alibaba 向量数据库集成:Milvus与Elasticsearch配置详解
数据库·人工智能·spring·elasticsearch·milvus·springai·springaialibaba
zone7_3 天前
008-01:RAG 入门-向量存储与企业级向量数据库 milvus
数据库·milvus
冷小鱼3 天前
Milvus 向量数据库完全指南:开源架构与生产级部署实战
数据库·开源·milvus
骇客野人3 天前
向量数据库Milvus的安装使用
数据库·milvus
core5125 天前
深入浅出 Milvus 向量数据库:从核心原理到 Python 实战指南
数据库·python·milvus·向量数据库·语义检索
San30.5 天前
深入浅出 RAG 与向量数据库:从 Milvus 基础到电子书级语义搜索实战
数据库·人工智能·langchain·llm·milvus·rag
luckyzlb5 天前
01-milvus
ai·milvus·spring ai·langchain4j·springaialibaba
SuniaWang6 天前
Vue 3 + Spring Boot 21 全栈 RAG 项目Docker Compose 容器化部署
vue.js·人工智能·spring boot·spring·阿里云·docker·milvus
装不满的克莱因瓶8 天前
【从零搭建】SpringAI Alibaba + RAG + Milvus + Qwen 项目实战
人工智能·ai·大模型·milvus·rag·springai·向量库