JAVA:Milvus 知识库如何对多个字段进行检索

发布时间:2026/9/22 10:04:30

JAVA:Milvus 知识库如何对多个字段进行检索 依赖milvus-sdk-java 2.4.x / 2.5.xMilvus 2.x 服务端通用MavendependencygroupIdio.milvus/groupIdartifactIdmilvus-sdk-java/artifactIdversion2.5.0/version/dependency场景说明向量字段embedding做语义相似度检索多个标量字段通过expr过滤category、source、create_timeJava SDK Search API 核心searchParam.withExpr(多字段条件表达式)集合Schema对应代码示例字段类型说明idINT64(主键)文档IDembeddingFLOAT_VECTOR向量dim1024categoryVARCHAR文档分类sourceVARCHAR来源create_timeINT64创建时间戳contentVARCHAR文档正文完整Java示例代码importio.milvus.client.MilvusServiceClient;importio.milvus.common.clientenum.ConsistencyLevelEnum;importio.milvus.param.ConnectParam;importio.milvus.param.R;importio.milvus.param.dml.SearchParam;importio.milvus.response.SearchResultsWrapper;importio.milvus.grpc.DataType;importjava.util.ArrayList;importjava.util.List;publicclassMilvusMultiFieldSearchDemo{publicstaticvoidmain(String[]args){// 1. 创建Milvus客户端ConnectParamconnectParamConnectParam.newBuilder().withHost(127.0.0.1).withPort(19530)// 开启鉴权时添加// .withUsername(root)// .withPassword(xxxx).build();MilvusServiceClientclientnewMilvusServiceClient(connectParam);StringcollectionNameknowledge_base;// 2. 组装查询向量业务中替换为文本向量化后的float数组ListFloatqueryVectornewArrayList();for(inti0;i1024;i){queryVector.add(0.01f);}ListListFloatvectorsnewArrayList();vectors.add(queryVector);// // 【重点】多标量字段过滤表达式 expr// 语法规则字符串使用双引号and / or 组合多个条件// Stringexprcategory \电力文档\ and source in [\内部手册\, \规范文件\] and create_time 1700000000;// 3. 构建Search参数SearchParamsearchParamSearchParam.newBuilder().withCollectionName(collectionName).withVectors(vectors).withVectorFieldName(embedding)// 向量字段.withTopK(10)// 返回top10.withExpr(expr)// 多字段过滤条件.addOutField(id).addOutField(category).addOutField(source).addOutField(create_time).addOutField(content).withMetricType(COSINE).withParams({\nprobe\:16}).withConsistencyLevel(ConsistencyLevelEnum.EVENTUALLY).build();// 4. 执行检索RSearchResultsWrapperresponseclient.search(searchParam);if(!response.isSuccess()){System.err.println(检索失败: response.getException().getMessage());client.close();return;}SearchResultsWrapperresultsWrapperresponse.getData();// 5. 解析结果ListSearchResultsWrapper.IDScorehitListresultsWrapper.getIDScore(0);for(SearchResultsWrapper.IDScorehit:hitList){longdocIdhit.getLongID();floatscorehit.getScore();// 获取标量字段StringcategoryresultsWrapper.getFieldData(category,0).getAsString(hit.getIndex());StringsourceresultsWrapper.getFieldData(source,0).getAsString(hit.getIndex());StringcontentresultsWrapper.getFieldData(content,0).getAsString(hit.getIndex());LongcreateTimeresultsWrapper.getFieldData(create_time,0).getAsLong(hit.getIndex());System.out.printf(score%.4f, id%d%n,score,docId);System.out.printf(category%s, source%s, time%d%n,category,source,createTime);System.out.println(content:content);System.out.println(------------------------);}client.close();}}常用expr条件示例直接复制修改// 示例1and 多条件Stringexpr1category \防洪\ and create_time 1700000000;// 示例2or 或条件Stringexpr2source \内部手册\ or source \行业标准\;// 示例3模糊匹配 Milvus 2.4 支持 likeStringexpr3category \业扩报装\ and content like \%营商环境%\;// 示例4not 取反Stringexpr4category \应急管理\ and not source \草稿\;重要知识点Java开发常见问题1. 多个向量字段如何检索Milvus不支持一次search同时检索多个向量列无法同时指定多个vectorFieldName解决方案分别执行两次search标题向量、正文向量在Java代码内实现RRF倒数融合 / 加权分数融合合并结果伪代码参考// 检索标题向量SearchParamparamTitlebuildSearch(title_emb,queryTitleVec,expr);// 检索正文向量SearchParamparamContentbuildSearch(embedding,queryContentVec,expr);// 拿到两组结果自定义融合排序2. 只想查询标量字段不做向量检索→ 使用QueryParamimportio.milvus.param.dml.QueryParam;QueryParamqueryParamQueryParam.newBuilder().withCollectionName(knowledge_base).withExpr(category \电力文档\ and create_time 1700000000).addOutField(id).addOutField(content).build();RSearchResultsWrapperqueryRespclient.query(queryParam);3. 性能优化建议经常过滤的标量字段建立标量索引// Java创建标量索引示例VARCHAR/INT字段IndexParamindexParamIndexParam.newBuilder().withCollectionName(collectionName).withFieldName(category).withIndexType(TREE).build();client.createIndex(indexParam);查询时使用ConsistencyLevelEnum.EVENTUALLY提升查询速度不要写过于复杂的like模糊查询海量数据很慢4. 避坑清单expr 字符串必须双引号文本不要单引号expr不要直接拼接用户输入 →SQL注入风险一定要参数化处理生产建议封装工具类使用值替换禁止字符串直接拼接用户原始文本集合没有执行load()直接查询会报错向量维度和建表dim不一致抛出异常
延伸阅读

更多相关文章

2026/9/21 4:18:52

CPU不支持虚拟化时,如何用VMware运行32位虚拟机

1. 问题界定:当硬件明确“不支持”虚拟化时遇到“此主机不支持 Intel VT-x”的提示,很多人的第一反应是去 BIOS 里找开关。但标题里用了一连串的感叹号强调了一个关键区别:“不是支持但禁用,而是根本不支持!”这直接把…

2026/9/20 2:53:27

光伏电站动态无功优化配置与Matlab实现

1. 项目背景与核心价值光伏电站作为分布式电源的重要组成部分,其快速无功响应特性对电网稳定运行具有关键作用。传统分布式电源配置方法往往忽略这一动态特性,导致电网在电压波动时无法快速调节。我们开发的这套基于Matlab的优化配置方法,首次…

2026/9/20 2:53:28

傅里叶变换在电力谐波检测中的MATLAB/Python实战

1. 傅里叶变换与谐波检测的工程实践电力系统中谐波污染就像水管里的杂质,虽然看不见但会腐蚀设备。我在某变电站电能质量改造项目中,曾用傅里叶变换成功定位了3次谐波超标的罪魁祸首——某企业违规使用的整流设备。这个经历让我深刻认识到,掌…

2026/9/22 10:00:25

数据结构java从入门到实战

Java数据结构源码拆解:从入门到精通避坑指南 官方文档太长,翻到第三页就头晕?想搞懂 数据结构java 底层逻辑,却总被 ArrayList 的扩容机制绕晕?别慌。 很多开发者卡在 入门到精通 的瓶颈期,就是因为只背…

2026/9/22 10:00:25

xxx65报错速查手册:3步看懂堆栈日志

xxx65报错速查手册:3步看懂堆栈日志 报错一堆看不懂 StackTrace,是不是让你瞬间大脑宕机,甚至想直接放弃?别慌,这其实是绝大多数应届生刚接触生产环境时的共同噩梦。 我整理了一份 xxx65…

2026/9/22 10:00:25

周鸿祎博客高频面试题解析:3个核心机制助你告别原理盲区

周鸿祎博客高频面试题解析:3个核心机制助你告别原理盲区 面试被问原理答不上来,是不是让你瞬间大脑一片空白?那种明明写过代码,却说不清背后为什么这么跑的无力感,是无数开发者的噩梦。尤其是当面试官抛出关于“周鸿祎博客”这类高并发架构的…

2026/9/22 9:55:25

好莱坞艳照面试必问

好莱坞艳照面试必问:3个前端坑帮你新手避坑 刚学完 div 和 span ,一打开空白的 index.html 就发呆?别慌,这毛病我见得太多了。很多人啃完教程,语法背得滚瓜烂熟,真让他搭个像样的页面,鼠标在屏幕上划拉半天,连个像样的布局都…

2026/9/22 10:02:42

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/22 9:07:39

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/22 0:04:49

输电线路在线监测高频面试题拆解 3秒抓住官方文档重点

输电线路在线监测高频面试题拆解 3秒抓住官方文档重点 官方文档几百页翻到头还是懵?面试问到 输电线路在线监测 的数据链路时,脑子一片空白?别慌,这种 高频面试题 我整理了10年,专门治各种“文档太长抓不住重点”的毛病。…

2026/9/22 0:04:49

中介房源管理系统重构避坑:3个关键步骤搞定API变更

中介房源管理系统重构避坑:3个关键步骤搞定API变更 版本升级后 API 全变了,这种痛只有真做过的人懂。 很多团队在接手老旧房产项目时,最崩溃的不是代码烂,而是底层框架升级后,原本熟悉的接口调用方式彻底失效。 这份 保姆级教程…

2026/9/22 0:04:49

3个坑点带你一文搞懂55gg小游戏源码

3个坑点带你一文搞懂55gg小游戏源码 盯着控制台满屏的红色报错,看着那一长串 StackTrace ,是不是脑子瞬间宕机?别急,这种时候最忌讳的就是盲目改代码。很多刚入行的前端同学,面对 55gg 小游戏这类轻量级 H5…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/21 18:32:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/21 10:29:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码