SpringBoot集成Milvus|(实现向量的存储和查询)

此文章为转载文章: 原文链接

文章目录
  • SpringBoot集成Milvus|(实现向量的存储和查询)
  • 前言
  • 一、Milvus介绍
  • 二、Milvus数据库安装
  • 1.Milvus安装环境准备(centos7)
  • 2.Milvus客户端安装
  • 3.attu新建Milvus集合
  • 三、Milvus集成
  • 1.依赖引入
  • 2.客户端初始化
  • 3.代码创建集合示例
  • 总结

原文链接: SpringBoot集成Milvus|(实现向量的存储和查询)

前言

随着互联网不断发展,电子邮件、论文、物联网传感数据、社交媒体照片、蛋白质分子结构等非结构化数据已经变得越来越普遍。如果想要使用计算机来处理这些数据,需要使用 embedding 技术将这些数据转化为向量。随后,Milvus 会存储这些向量,并为其建立索引。Milvus 能够根据两个向量之间的距离来分析他们的相关性。如果两个向量十分相似,这说明向量所代表的源数据也十分相似

一、Milvus介绍

Milvus 是一款云原生向量数据库,它具备高可用、高性能、易拓展的特点,用于海量向量数据的实时召回。
Milvus 基于 FAISS、Annoy、HNSW 等向量搜索库构建,核心是解决稠密向量相似度检索的问题。在向量检索库的基础上,Milvus 支持数据分区分片、数据持久化、增量数据摄取、标量向量混合查询、time travel 等功能,同时大幅优化了向量检索的性能,可满足任何向量检索场景的应用需求。通常,建议用户使用 Kubernetes 部署 Milvus,以获得最佳可用性和弹性。

二、Milvus数据库安装

1.Milvus安装环境准备(centos7)

1、服务器需要部署docker以及docker-compose 2、新建一个工作目录 3、获取Milvus的安装启动YAML文件 4、获取文件

wget https://github.com/milvus-io/milvus/releases/download/v2.1.4/milvus-standalone-docker-compose.yml -O docker-compose.yml

5、启动docker镜像

docker-compose up -d

6、启动后容器情况

在这里插入图片描述

7、停止Milvus容器

docker-compose down

2.Milvus客户端安装

1、在docker仓库中找到Milvus对应版本的客户端镜像
2、拉取镜像;docker pull zilliz/attu:v2.1.0
3、运行attu
docker run -itd --restart=always -p 13000:3000 -e HOST_URL=http://{ip}:13000 -e MILVUS_URL={ip}:19530 zilliz/attu:v2.1.0
ip为部署ip
4、浏览器登陆访问:http://{ip}:13000

三、Milvus集成
1.依赖引入

java操作Milvus的组件工具

<!-- milvus向量数据库  -->
<dependency>
<groupId>io.milvus</groupId>
<artifactId>milvus-sdk-java</artifactId>
<version>2.2.4</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
</exclusions>
</dependency>
2.客户端初始化

初始化客户端使用实例,放入容器

@Configuration
public class MilvusConfig {
@Value("${milvus.host}")
private String host;
@Value("${milvus.port}")
private Integer port;@Bean
public MilvusServiceClient milvusServiceClient() {return new MilvusServiceClient(ConnectParam.newBuilder().withHost(host).withPort(port).build());
}

}

3.代码示例集合
public class PushMaterielsConst {
/**
* 集合名称(库名)
*/
public static final String COLLECTION_NAME = “content3”;

public static final String PARTITION_NAME = "content3_partion";/*** 分片数量*/
public static final Integer SHARDS_NUM = 1;
/*** 分区数量*/
public static final Integer PARTITION_NUM = 1;/*** 分区前缀*/
public static final String PARTITION_PREFIX = "shards_";
/*** 向量值长度*/
public static final Integer FEATURE_DIM = 256;public static final Boolean TRUE = true;/*** 字段*/
public static class Field {/*** 主键idID*/public static final String ID = "id";/*** 文本id*/public static final String CONTENT = "content";/*** 向量值*/public static final String CONTENT_INTRO = "content_intro";
}

}

4.测试用例

yml

milvus:
host: 10.0.3.65
port: 19530

logging:
level:
io.milvus.client: debug

测试用例代码

@SpringBootTest
@Slf4j
class MilvusConfigTest {

@Autowired
MilvusClient milvusClient;@Test
void test() {R&lt;QueryResults&gt; query = milvusClient.query(QueryParam.newBuilder().withCollectionName("content3").build());log.info("query:{}", JSONUtil.toJsonStr(query));
}@Test
public void creatCollection() {FieldType fieldType1 = FieldType.newBuilder().withName(PushMaterielsConst.Field.ID).withDataType(DataType.Int64).withPrimaryKey(true).withAutoID(true).build();FieldType fieldType2 = FieldType.newBuilder().withName(PushMaterielsConst.Field.CONTENT).withDataType(DataType.VarChar).withMaxLength(255).build();FieldType fieldType3 = FieldType.newBuilder().withName(PushMaterielsConst.Field.CONTENT_INTRO).withDataType(DataType.FloatVector).withDimension(2).build();CreateCollectionParam createCollectionReq = CreateCollectionParam.newBuilder().withCollectionName(PushMaterielsConst.COLLECTION_NAME).withDescription("user content search").withShardsNum(2).addFieldType(fieldType1).addFieldType(fieldType2).addFieldType(fieldType3).build();R&lt;RpcStatus&gt; collection = milvusClient.createCollection(createCollectionReq);log.info("collection:{}", JSONUtil.toJsonStr(collection));
}/*** 插入数据** @return*/
@Test
public void insertPrepare() {List&lt;String&gt; content_array = new ArrayList&lt;&gt;();List&lt;List&lt;Float&gt;&gt; vector_array = new ArrayList&lt;&gt;();for (int i = 0; i &lt; 5; i++) {content_array.add("test" + i);vector_array.add(Arrays.asList(1.1f + i * 1f, 2.2f + i * 2f));}List&lt;InsertParam.Field&gt; fields = new ArrayList&lt;&gt;();fields.add(new InsertParam.Field(PushMaterielsConst.Field.CONTENT, content_array));fields.add(new InsertParam.Field(PushMaterielsConst.Field.CONTENT_INTRO, vector_array));InsertParam insertParam = InsertParam.newBuilder().withCollectionName(PushMaterielsConst.COLLECTION_NAME).withPartitionName(PushMaterielsConst.PARTITION_NAME).withFields(fields).build();R&lt;MutationResult&gt; insert = milvusClient.insert(insertParam);log.info("insert:{}", JSONUtil.toJsonStr(insert));
}@Test
public void searchTallestSimilarity() {loadCollection();List&lt;List&lt;Float&gt;&gt; list = new ArrayList&lt;&gt;();list.add(Arrays.asList(1.1f, 2.2f));SearchParam searchParam = SearchParam.newBuilder()//集合名称.withCollectionName(PushMaterielsConst.COLLECTION_NAME).withPartitionNames(Arrays.asList(PushMaterielsConst.PARTITION_NAME))//计算方式// 欧氏距离 (L2)// 内积 (IP).withMetricType(MetricType.L2).withOutFields(Arrays.asList(PushMaterielsConst.Field.CONTENT))//返回多少条结果.withTopK(5)//搜索的向量值.withVectors(list)//搜索的Field.withVectorFieldName(PushMaterielsConst.Field.CONTENT_INTRO).withParams("{\"content\":\"test56\"}").build();R&lt;SearchResults&gt; search = milvusClient.search(searchParam);List&lt;String&gt; returnList = Lists.newArrayList();SearchResultsWrapper wrapper = new SearchResultsWrapper(search.getData().getResults());for (int i = 0; i &lt; list.size(); i++) {List&lt;?&gt; fieldData = wrapper.getFieldData(PushMaterielsConst.Field.CONTENT, i);for (int j = 0; j &lt; fieldData.size(); j++) {returnList.add((String) fieldData.get(j));}}log.info("----搜索结果------{}",JSONUtil.toJsonStr(returnList));
}public void loadCollection() {R&lt;RpcStatus&gt; response = milvusClient.loadPartitions(LoadPartitionsParam.newBuilder()//集合名称.withCollectionName(PushMaterielsConst.COLLECTION_NAME)//需要加载的分区名称.withPartitionNames(Lists.newArrayList(PushMaterielsConst.PARTITION_NAME)).build());log.info("Milvus数据加载到内存状态:{}", response.getStatus());
}

}


上述为springboot集成Milvus数据库的实现

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

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

相关文章

数据结构__01

六.图 一.定义 1.有向图 2.无向图 3.完全图 4.子图 5.度 6.路径以及长度 7.简单路径 回路 简单回路 二.图的存储结构 1.邻接矩阵 有向图 无向图 有向网 2.邻接矩阵的优缺点 &#xff08;行出列入&#xff09; 3.邻接表 三.图的遍历 深度优先遍历 广度优先遍历 四.图的应用 …

嵌入式蓝桥杯学习1 电量LED

cubemx配置 1.新建一个STM32G431RBT6文件 2.在System-Core中点击SYS&#xff0c;找到Debug&#xff08;设置为Serial Wire&#xff09; 3.在System-Core中点击RCC&#xff0c;找到High Speed Clock(设置为Crystal/Ceramic Resonator) 4.打开Clock Configuration &#xff0…

【网络】协议与网络传输

目录 一、协议 1.1 认识协议 1.2 协议分层 二、OSI七层模型 三、TCP/IP五(四)层模型 四、网络传输 4.1 数据包封装与分用 4.2 网络传输基本流程 4.2.1 以太网通信 &#xff08;1&#xff09;原理 &#xff08;2&#xff09;数据碰撞问题 &#xff08;3&#xff09;…

【力扣】3274. 检查棋盘方格颜色是否相同

一、题目 给你两个字符串 coordinate1 和 coordinate2&#xff0c;代表 8 x 8 国际象棋棋盘上的两个方格的坐标。以下是棋盘格的参考图&#xff1a; 如果这两个方格颜色相同&#xff0c;返回 true&#xff0c;否则返回 false。坐标总是表示有效的棋盘方格。坐标的格式总是先字…

JavaWeb12

登陆拦截 会话技术 会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应 会话跟踪&#xff1a;一种维护浏览器状态的方法&#xff0c;服务器需要识…

使用STM32CubeMX配置串口各种功能

使用STM32CubeMX配置串口各种功能 STM32CubeMX软件的安装接收空闲中断STM32CubeMX配置1.新建工程2. 选择芯片3. 选择时钟和下载方式4. 配置串口5.设置工程消息6.生成代码7.修改生成的代码 空闲中断DMA转运STM32CubeMX配置4.配置串口5.设置工程消息6.生成代码7.修改生成的代码 S…

Linux详解:文件权限

文章目录 前言Linux文件权限基础文件成员与三组权限字符 权限的修改修改文件所有者总结 前言 在浩瀚的操作系统世界中&#xff0c;Linux以其开源、灵活和强大的特性&#xff0c;成为了服务器、开发环境以及众多个人用户的首选。而在Linux的众多特性中&#xff0c;文件权限机制…

openEuler 22.03 使用cephadm安装部署ceph集群

目录 目的步骤规格步骤ceph部署前准备工作安装部署ceph集群ceph集群添加node与osdceph集群一些操作组件服务操作集群进程操作 目的 使用ceph官网的cephadm无法正常安装&#xff0c;会报错ERROR: Distro openeuler version 22.03 not supported 在openEuler上实现以cephadm安装部…

xiaolin coding 图解 MySQL笔记——事务篇

1. 事务隔离级别是怎么实现的&#xff1f; 数据库中的**事务&#xff08;Transaction&#xff09;**先开启&#xff0c;然后等所有数据库操作执行完成后&#xff0c;才提交事务&#xff0c;对于已经提交的事务来说&#xff0c;该事务对数据库所做的修改将永久生效&#xff0c;…

掌握 Spring Boot 中的缓存:技术和最佳实践

缓存是一种用于将经常访问的数据临时存储在更快的存储层&#xff08;通常在内存中&#xff09;中的技术&#xff0c;以便可以更快地满足未来对该数据的请求&#xff0c;从而提高应用程序的性能和效率。在 Spring Boot 中&#xff0c;缓存是一种简单而强大的方法&#xff0c;可以…

408——数据结构(持续更新)

文章目录 一、绪论1.1 相关概念1.2 数据结构三要素1.3 相关习题1.4 复杂度1.4.1 时间复杂度1.4.2 复杂度相关习题 二、线性表 一、绪论 1.1 相关概念 数据&#xff1a;数据是信息的载体&#xff0c;所有能被输入到计算机中&#xff0c;且能被计算机处理的符号的集合。如图片、…

深入浅出:开发者如何快速上手Web3生态系统

Web3作为互联网的未来发展方向&#xff0c;正在逐步改变传统互联网架构&#xff0c;推动去中心化技术的发展。对于开发者而言&#xff0c;Web3代表着一个充满机遇与挑战的新领域&#xff0c;学习和掌握Web3的基本技术和工具&#xff0c;将为未来的项目开发提供强大的支持。那么…

C++学习日记---第16天

笔记复习 1.C对象模型 在C中&#xff0c;类内的成员变量和成员函数分开存储 我们知道&#xff0c;C中的成员变量和成员函数均可分为两种&#xff0c;一种是普通的&#xff0c;一种是静态的&#xff0c;对于静态成员变量和静态成员函数&#xff0c;我们知道他们不属于类的对象…

Leetcode 每日一题 205.同构字符串

目录 问题描述 过题图片 示例 解决方案 代码实现 题目链接 总结 问题描述 给定两个字符串 s 和 t&#xff0c;判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t&#xff0c;那么这两个字符串是同构的。具体来说&#xff0c;每个出现的字符都应当映射…

C# 集合(Collection)

文章目录 前言一、动态数组&#xff08;ArrayList&#xff09;二、哈希表&#xff08;Hashtable&#xff09;三、排序列表&#xff08;SortedList&#xff09;四、堆栈&#xff08;Stack&#xff09;五、队列&#xff08;Queue&#xff09;六、点阵列&#xff08;BitArray&…

2.5 特征降维(机器学习)

2.5 特征降维 2.5.1 降维 降维&#xff1a;是指在某些限定条件下&#xff0c;降低随机变量&#xff08;特征&#xff09;个数&#xff0c;得到一组“不相关”主变量的过程。 ndarray 维数 嵌套的层数 0维 标量 1维 向量 2维 矩阵 3维 n维 二维数组 降低的维度…

【小白学机器学习41】如何从正态分布的总体中去抽样?比较不同的取样方差的差别

目录 1 目标&#xff1a;使用2种方法&#xff0c;去从正态分布的总体中去抽样&#xff0c;获得样本 1.1 step1: 首先&#xff0c;逻辑上需要先有符合正态分布的总体population 1.2 从总体中取得样本&#xff0c;模拟抽样的过程 2 从正态分布抽样的方法1 3 从正态分布抽样…

框架5:SpringBoot 2 - 核心功能

SpringBoot2 - 基础入门【一 ~ 五】&#xff0c;详见&#xff1a; 六、配置文件 6.1 properties文件格式 同之前的用法。 6.2 yaml文件格式【推荐】 YAML本意&#xff1a;“YAML”不是一种标记语言。但在开发中&#xff0c;实际把它理解为&#xff1a;“Yet Another Markup Lan…

行为型设计模式之《责任链模式》实践

定义 责任链模式&#xff08;Chain Of Responsibility Pattern&#xff09;顾名思义&#xff0c;就是为请求创建一条处理链路&#xff0c;链路上的每个处理器都判断是否可以处理请求&#xff0c;如果不能处理则往后走&#xff0c;依次从链头走到链尾&#xff0c;直到有处理器可…

Vue前端开发-路由树配置

一个配置路由的文件由导入路由模块、创建路由对象和导出路由对象三个部分组成&#xff0c;在创建路由对象时&#xff0c;需要构建路由数组&#xff0c;路由数组中包括一级、二级和多级路由结构&#xff0c;因此&#xff0c;这种结构的路由配置&#xff0c;又称为路由树配置。 …