springboot milvus search向量相似度查询 踩坑使用经验

1.前提提要:java的pom 版本为:2.4.9 milvus 版本是:2.4.13-hotfix
2.先来工具类方法

    /*** 向量搜索* @param client* @param query* @return*/public SearchResp search(@NonNull MilvusClientV2 client, @NonNull VectorCondition query) {final List<BaseVector> data = query.getData();if (CollectionUtils.isEmpty(data)) {return null;}SearchReq.SearchReqBuilder searchReqBuilder = SearchReq.builder().collectionName(query.getCollectionName()).data(data);if (query.getTopK() > 0) {searchReqBuilder.topK(query.getTopK());}if (!StringUtils.isEmpty(query.getAnnsField())) {searchReqBuilder.annsField(query.getAnnsField());}if (!CollectionUtils.isEmpty(query.getSearchParams())) {searchReqBuilder.searchParams(query.getSearchParams());}if (!CollectionUtils.isEmpty(query.getPartitionNames())) {searchReqBuilder.partitionNames(query.getPartitionNames());}if (!CollectionUtils.isEmpty(query.getOutputFields())) {searchReqBuilder.outputFields(query.getOutputFields());} else {searchReqBuilder.outputFields(Collections.singletonList("*"));}if (StringUtils.isNotBlank(query.getFilter())) {searchReqBuilder.filter(query.getFilter());}final SearchResp search = client.search(searchReqBuilder.build());return search;}

3.包装的请求条件

@Data
@Builder
public class VectorCondition {//现有集合的名称。@NonNullString collectionName;String partitionName;//分区名称列表。List<String> partitionNames;//返回每个实体中包含的字段名称列表。//该值默认为None。如果未指定,则选择集合中的所有字段作为输出字段。List<String> outputFields;//要查询的实体的 ID。List<Object> ids;//用于筛选匹配实体的标量筛选条件。//您可以将此参数设置为空字符串以跳过标量过滤。要构建标量过滤条件,请参阅布尔表达式规则。String filter;//目标集合的一致性级别。//该值默认为创建当前集合时指定的值,选项包括Strong ( 0 )、Bounded ( 1 )、Session ( 2 ) 和Finally ( 3 )。ConsistencyLevel consistencyLevel;//查询结果中要跳过的记录数。//您可以结合使用此参数来limit启用分页。//该值的总和limit应小于 16,384。long offset;//查询结果中返回的记录数。//您可以结合使用此参数来offset启用分页。//该值的总和offset应小于 16,384。long limit;//矢量字段的名称,当有多个矢量字段时使用。如果只存在一个矢量字段,我们将直接使用它String annsField;//搜索结果中返回的记录数。此参数使用与参数相同的语法limit,因此您只应设置其中一个。//您可以结合使用此参数来offset启用分页。//该值的总和offset应小于 16,384。int topK;//向量嵌入的列表。//Milvus 搜索与指定的向量嵌入最相似的向量嵌入。List<BaseVector> data;//插入的向量。List<JsonObject> dataJson;//Milvus 将计算出的距离四舍五入到的小数位数。//该值默认为-1,表示 Milvus 跳过对计算距离进行四舍五入并返回原始值。int roundDecimal;//此操作特有的参数设置。//metric_type (字符串)//应用于此操作的度量类型。这应该与索引上面指定的矢量字段时使用的类型相同。//可能的值是L2、IP和COSINE。//半径(浮点数)//确定最小相似度的阈值,设置metric_type为时L2,确保该值大于range_filter的值,否则,该值应小于range_filter的值。//范围过滤器(浮点数)//将搜索范围缩小到特定相似度范围内的向量。设置metric_type为IP或 时COSINE,请确保此值大于 radius 。否则,此值应小于radius。Map<String, Object> searchParams;//是否在相似性搜索期间忽略增长的片段。boolean ignoreGrowing;//设置字段名称以对结果进行分组。String groupByFieldName;
}

4.向量数据的转换

   final List<Object> data;// 使用Stream API进行转换List<Float> floatList = data.stream().map(obj -> obj instanceof Double ? ((Double) obj).floatValue() : (Float) obj) // 转换为Float.collect(Collectors.toList()); // 收集结果到新的列表List<BaseVector> requestData = new ArrayList<>();final FloatVec baseVector = new FloatVec(floatList);requestData.add(baseVector);Map<String, Object> params = new HashMap<>();params.put("nprobe", "1024");params.put("radius", 0.5f);final VectorCondition vector = VectorCondition.builder().collectionName("xxxxx").annsField("vector").topK(1).searchParams(params).data(requestData).build();SearchResp searchR = (SearchResp) milvusUtil.execute("search", vector);final List<List<SearchResp.SearchResult>> searchResults = searchR.getSearchResults();for (List<SearchResp.SearchResult> results : searchResults) {for (SearchResp.SearchResult result : results) {System.out.printf("ID: %s, Score: %f, %s\n", result.getId(), result.getScore(), result.getEntity().toString());}}

使用线程池获取MilvusClient连接对象,具体可看之前的博客

            case MilvusUtil.SEARCH:result = this.search(milvusClientPool.getClient(SEARCH), vectorCondition);break;

报错
Caused by: java.lang.ClassNotFoundException: com.google.gson.ToNumberPolicy
原因:java.lang.ClassNotFoundException:com.google.gson.ToNumberPolicy
和上次使用的经验一样,肯定没有最新的包,果然,换成最新的谷歌的包问题解决

        <!--milvus--><dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.4.9</version><exclusions><exclusion><artifactId>guava</artifactId><groupId>com.google.guava</groupId></exclusion><exclusion><artifactId>gson</artifactId><groupId>com.google.gson</groupId></exclusion></exclusions></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>26.0-jre</version><scope>compile</scope></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.11.1</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.9</version> <!-- 或者更新版本 --></dependency>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[网络安全] 滥用Azure内置Contributor角色横向移动至Azure VM

本文来源于团队的超辉老师&#xff0c;其系统分析了Azure RBAC角色模型及其在权限滥用场景下的攻击路径。通过利用AADInternals工具提升用户至Contributor角色&#xff0c;攻击者可在Azure VM中远程执行命令&#xff0c;创建后门账户&#xff0c;实现横向移动。文中详述了攻击步…

Android Compose 基础布局之 Box 和 Stack 源码深度剖析(九)

Android Compose 基础布局之 Box 和 Stack 源码深度剖析 一、引言 1.1 Android 开发中布局的重要性 在 Android 应用开发里&#xff0c;布局是构建用户界面&#xff08;UI&#xff09;的关键环节。良好的布局设计能够提升用户体验&#xff0c;使应用界面更加美观、易用且具有…

知识蒸馏:让大模型“瘦身“而不失智慧的魔术

引言&#xff1a;当AI模型需要"减肥" 在人工智能领域&#xff0c;一个有趣的悖论正在上演&#xff1a;大模型的参数规模每年以10倍速度增长&#xff0c;而移动设备的算力却始终受限。GPT-4的1750亿参数需要价值500万美元的GPU集群运行&#xff0c;但现实中的智能设备…

多路FM调频广播解调器:多路电台FM广播信号一体化解调处理方案

多路FM调频广播解调器&#xff1a;多路电台FM广播信号一体化解调处理方案 支持OEM型号开放式协议支持二次开发设计 北京海特伟业科技有限公司任洪卓发布于2025年3月21日 在信息传播领域&#xff0c;FM调频广播媒体以其独特的优势持续发挥着重要作用。为了应对日益增长的多路…

如何在Spring Boot中设置HttpOnly Cookie以增强安全性

引言 在Web开发中,Cookie是用于在客户端和服务器之间传递信息的重要机制。然而,Cookie的安全性一直是一个备受关注的问题。特别是当Cookie中存储了敏感信息(如会话ID)时,如何防止这些信息被恶意脚本窃取就显得尤为重要。HttpOnly属性是增强Cookie安全性的一种有效手段。本…

LangManus:新一代开源智能体框架如何让AI开发更简单?

你是否想过&#xff0c;代码生成、数据分析甚至系统调试&#xff0c;都能由一个“AI助手”自动完成&#xff1f;最近&#xff0c;一款名为LangManus的开源项目在开发者社区掀起热议。它不只是一个工具库&#xff0c;更是一个能自主思考、执行复杂任务的智能体框架。无论是企业内…

【STM32】SPI通信协议W25Q64Flash存储器芯片(学习笔记)

通信接口部分有介绍SPI&#xff1a;【STM32】USART串口协议&串口外设-学习笔记-CSDN博客 SPI通信协议 SPI通信 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线四根通信线&#xff1a;SCK&#xff08;Serial Clock&…

批量合并 PPT 文件,支持合并成单个文件也支持按文件夹合并

合并多个 PPT 为一个 PPT 文档是我们经常会碰到的需求&#xff0c;合并后不仅更容易管理&#xff0c;在某些场景&#xff08;比如批量打印&#xff09;下也非常的有用&#xff0c;那当我们需要批量合并多个 PPT 文档地时候&#xff0c;我们有没有比较高效的方法呢&#xff1f;今…

LDAP从入门到实战:环境部署与配置指南(下)

#作者&#xff1a;朱雷 接上篇&#xff1a;《LDAP从入门到实战&#xff1a;环境部署与配置指南&#xff08;上&#xff09;》 链接: link 文章目录 2.5.添加账号2.6.停止服务2.7.使用TLS证书2.7.1. TLS 证书2.7.2. TLS 配置2.7.3. 服务器配置 2.8.使用安全连接的反向代理 2.5…

发现一个好用的Vue.js内置组件

目录 一、这个好用的内置组件是什么&#xff1f; 二、这个组件的主要功能 三、怎么使用&#xff1f; 四、使用注意事项 五、我的使用场景 一、这个好用的内置组件是什么&#xff1f; 今天在优化我的平台应用时&#xff0c;发现一个好用的组件标签--<keep-alive>。 …

dart学习记录5(类、对象)

1.获取运行时对象类型 使用Object 属性的 runtimeType&#xff0c;它返回一个 Type 对象。 print(a 的类型是 ${a.runtimeType});⚠️警告 在测试对象的类型时建议使用object is Type比测试 object.runtimeType Type 更稳定。 2.实例变量的声明 class Point {double? x;…

启明星辰春招面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

Live555+Windows+MSys2 编译Androidso库和运行使用

下载 wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz tar -xzvf live555-latest.tar.gz加入版本控制 git init git add . git commit -a -m "first init" git log修改config.android-arm64 cd live vim config.android-arm64 ./genMakefile…

实用工具-Stirling-PDF

windows桌面版参考这个文档 Getting Started | Stirling-PDF 安装包推荐使用迅雷下载&#xff0c;先转存到迅雷网盘在使用迅雷下载速度嘎嘎快。 github:https://github.com/Stirling-Tools/Stirling-PDF Stirling-PDF 是一个强大的、基于 Web 的开源 PDF 处理工具&#xff0c…

借助AI Agent实现数据分析

在当今数据驱动的世界中&#xff0c;数据分析已成为企业决策、科学研究和社会治理的核心工具。然而&#xff0c;随着数据量的爆炸式增长和复杂性的提升&#xff0c;传统的数据分析方法面临着效率低下、成本高昂和人力不足等挑战。AI技术的快速发展&#xff0c;尤其是AI Agent的…

JavaScript实现一个函数,将数组扁平化(flatten),即把多维数组转为一维数组。

大白话实现一个函数&#xff0c;将数组扁平化&#xff08;flatten&#xff09;&#xff0c;即把多维数组转为一维数组。 思路 实现数组扁平化的基本思路是遍历数组中的每个元素&#xff0c;如果元素是数组&#xff0c;就递归地将其扁平化并添加到结果数组中&#xff1b;如果元…

麒麟操作系统安装人大金仓数据库

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 在当前数字化转型和信息安全备受重视的背景下&#xff0c;众多公司积极推进国产化改造进程。在操作系统领域&#xff0c;统信、open 欧拉、中标麒麟、银河麒麟等国产操作系统崭露头角&#xff0c;逐…

开发SAPUI5 Fiori应用并部署到SAP系统

首先新建一个项目文件夹 在VScode中打开 打开SAP Fiori&#xff08;需要先下载安装&#xff0c;参考上上一篇文章&#xff09; ,选择已添加的SAP S4 ERP系统 ,点击创建Firoi应用。 如果没有添加系统的&#xff0c;点击添加按钮&#xff0c;添加即可&#xff0c;注意&#xff…

右键添加:新建HTML模板文件

使用注册表给Windows右键添加:新建HTML文档模板的功能_注册表右键新建-CSDN博客 新建文件有了&#xff0c;但是没有引用模板文件&#xff0c;是空文件。 默认改成 htmlfile 模板成功

[极客大挑战 2019]Knife——3.20BUUCTF练习day4(1)

[极客大挑战 2019]Knife——3.20BUUCTF练习day4(1) 很简单 蚁剑连接 根目录下有flag flag{f77e8444-dd87-48b3-8fe0-a735b5a5c708}