发布时间:2026/8/3 5:47:36
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/8/3 5:47:36

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

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

2026/8/3 5:47:36

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

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

2026/8/3 5:42:36

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

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

2026/8/3 6:27:38

虚拟电厂微网调度:蒙特卡洛与随机优化实战解析

1. 项目背景与核心挑战虚拟电厂作为分布式能源聚合调度的新型模式,正在重塑电力系统的运行逻辑。这个项目直指虚拟电厂微网调度中最棘手的双重不确定性难题——既要应对电源侧(风电、光伏等)的出力波动,又要处理负荷侧的需求随机性…

2026/8/3 6:27:38

Android启动页适配与.9.png制作全指南

1. Android应用启动页适配的核心价值启动页(Splash Screen)作为用户打开应用时最先接触的界面,直接影响着产品的第一印象。根据Google的调研数据,应用启动时间每增加1秒,用户流失率就会上升16%。而一个设计精良的启动页…

2026/8/3 6:27:38

物联网设备OTA升级平台全解析:从原理到选型实战

1. 项目概述:在线OTA平台全景扫描在嵌入式开发和物联网领域,固件升级是个绕不开的话题。回想十年前,我们给设备更新程序还得抱着电脑和下载器,跑到现场一个个地接线、烧录,效率低不说,成本还高得吓人。后来…

2026/8/3 6:27:38

零配置AI声音克隆实战:Mossland如何降低音频生成门槛

最近在AI音频生成领域,一个现象级的工具正在快速出圈:Mossland。你可能已经厌倦了那些需要复杂环境配置、动辄几十GB模型下载的本地AI工具,也受够了某些在线服务高昂的费用和模糊的版权声明。当大家都在讨论“声音克隆”技术门槛有多高时&…

2026/8/3 6:22:38

应用层协议解析:从HTTP到DNS的核心技术与优化实践

1. 应用层在计算机网络中的核心地位计算机网络就像一座现代化的城市,而应用层就是这座城市里最热闹的商业区。作为OSI七层模型和TCP/IP四层模型中最接近用户的一层,应用层直接决定了我们日常使用的各种网络服务体验。从浏览网页到收发邮件,从…

2026/8/2 0:02:18

如何用免费工具突破游戏窗口限制:SRWE完整使用指南

如何用免费工具突破游戏窗口限制:SRWE完整使用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否遇到过这样的困扰?想为心爱的游戏截图,却发现游戏不支持自定义分辨率…

2026/8/2 1:52:02

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/1 0:03:49

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/2 8:56:50

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…