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

发布时间:2026/11/14 14:04:20

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/11/14 17:09:09

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

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

2026/11/14 22:51:40

AI声音克隆实战:Mossland在线工具让个性化语音合成触手可及

最近想给视频配音,但自己的声音要么太平淡,要么录出来有杂音,用AI配音工具吧,声音又太“机械”,一听就是合成的。你是不是也遇到过类似的问题?想找一个操作简单、效果自然,最好还不用折腾本地环…

2026/11/14 21:57:46

从一个人刷题到AI战队竞速,ctf-agent把CTF自动化又往前推了一步

◆ ◇ ◆01 项目介绍ctf-agent 到底是个什么东西?ctf-agent 是 Veria Labs 开源的一套自动化 CTF 解题 Agent。它的目标不是陪你聊题,而是直接接入 CTFd 平台,自动发现题目、分配模型、开 Docker 沙箱、跑工具、寻找 flag。最有意思的地方在…

2026/11/15 0:12:50

电工证解答题怎么答的值不值得考

电工证解答题怎么答的值不值得考 你是不是也在为“ 电工证解答题怎么答的 ”发愁?又担心去哪报名会被中介坑,还纠结这个证 值不值得考…

2026/11/15 0:12:50

安徽低压电工证培训怎么报名,学历不高也能考?

安徽低压电工证培训怎么报名,学历不高也能考? 你是不是也担心自己学历不高,连个低压电工证都报不了名?别急,今天就给你说说安徽低压电工证培训怎么报名,不光是流程,还有考试内容、实操要求,以及怎么准备才能一次通过,别再说“学历不行”了。…

2026/11/15 0:12:50

电车维修电工证哪里考怎么查网上查询流程全解

电车维修电工证哪里考怎么查网上查询流程全解 实操考试心里没底怕挂科?网上查证流程太复杂?作为漯河一家劳务班组的负责人,我知道你最担心的不是报名费,而是证书真伪、考试通过率、能不能顺利上岗干活。特别是现在电车维修电工证的需求量越来越大,但很多…

2026/11/15 0:12:50

湖北初级电工证多少钱?实操考试心里没底怕挂科怎么破?

湖北初级电工证多少钱?实操考试心里没底怕挂科怎么破? 你是不是也担心湖北初级电工证实操考试会挂科?担心自己学不会,担心培训费用太高,甚至担心自己辛辛苦苦考下来证,却找不到合适的工作?这些问题其实很多人都有,但别急,这篇文章就帮你把湖北初级电…

2026/11/15 0:02:49

电工证考试口诉怎么准备值不值得考

电工证考试口诉怎么准备值不值得考 实操考试心里没底怕挂科,这是大多数准备考电工证的人心里最真实的感受。尤其是面对【电工证考试口诉】环节,很多人不知道该怎么准备,甚至担心自己说不好就被淘汰。其实,只要掌握方法, 值不值得考…

2026/11/15 0:02:49

桑植县考电工证千万别踩坑!报名全流程教你避坑

桑植县考电工证千万别踩坑!报名全流程教你避坑 你是不是也遇到过这种情况:想考个电工证,但不知道从哪儿下手,怕被中介坑,怕花冤枉钱,更怕考了证还不能用?别急,这正是你该看这篇文章的原因。在桑植县考电工证,确实有很多人被坑过,但只要你知道流程、…

2026/11/15 0:02:49

电工证考试口诉怎么准备值不值得考

电工证考试口诉怎么准备值不值得考 实操考试心里没底怕挂科,这是大多数准备考电工证的人心里最真实的感受。尤其是面对【电工证考试口诉】环节,很多人不知道该怎么准备,甚至担心自己说不好就被淘汰。其实,只要掌握方法, 值不值得考…

2026/11/15 0:02:49

桑植县考电工证千万别踩坑!报名全流程教你避坑

桑植县考电工证千万别踩坑!报名全流程教你避坑 你是不是也遇到过这种情况:想考个电工证,但不知道从哪儿下手,怕被中介坑,怕花冤枉钱,更怕考了证还不能用?别急,这正是你该看这篇文章的原因。在桑植县考电工证,确实有很多人被坑过,但只要你知道流程、…

2026/11/13 22:32:11

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/13 12:14:39

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

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

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

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