记录一次向量数据库的部署过程

HangYF Lv2

部署

使用wsl2+ docker-desktop + milvus-2.3.12进行部署。wsl2和docker-desktop的安装部分不再赘述,主要看milvus。从milvus的release网站找到对应版本下载docker-compose文件即可。对包含docker-compose的文件夹下创建如图所示几个文件夹

1
2
3
4
5
6
7
|--conf
|--db
|--logs
|--pic
|--volumes
|--wal
docker-compose.yml

然后使用在文件夹路径下使用:

1
docker run -it zilliz/milvus_cli:latest

等待docker下载完毕,即可部署完成。

Springboot整合milvus

在maven中添加适配docker中milvus部署版本的milvus-sdk-java,适配版本要到官网上java-sdk的部分去找。这里使用的版本是2.3.4,需要在maven中添加以下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<dependency>
<groupId>io.milvus</groupId>
<artifactId>milvus-sdk-java</artifactId>
<version>2.3.4</version>
<exclusions>
<!--排除自带的log4j 防止冲突-->
<exclusion>
<artifactId>log4j-slf4j-impl</artifactId>
<groupId>org.apache.logging.log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.24.1</version>
</dependency>

配置一个Milvus客户端,由springBoot管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Configuration
public class MilvusConfig {
@Value("${milvus.host}")
private String host;

@Value("${milvus.port}")
private Integer port;

@Value("${milvus.username}")
private String username;

@Value("${milvus.password}")
private String password;

@Bean
public MilvusServiceClient milvusServiceClient() {
return new MilvusServiceClient(
ConnectParam.newBuilder()
.withHost(host)
.withPort(port)
.withAuthorization(username, password)
.build());
}
}

milvus的service接口和对应实现

这里依据要求写了若干个service方法,如创建collection(可以理解为表)、创建索引(插入和搜索的前提操作)、通过id查询向量、搜寻与给定向量最相似的前K个向量,判断是否为可用的collection、以及删除collection。共6个方法

因为导入数据的方法需要自己来写,无法使用cli工具(milvus-cli是为milvus-lite提供的,而这里部署的是milvus-standalone,没有cli工具),所以额外实现了从CSV文件读取向量数据,以及向部署好的向量数据库插入向量的2个方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public interface MilvusService {

void create(String collectionName, String desc);

void createIndex(String name);

List<Long> search(String collectionName, int topK, List<List<Float>> vectorList);

List<List<Float>> getVectorById(String collectionName, Integer id);

Boolean hasCollect(String collectionName);

void dropCollect(String collectionName);

List<List<Float>> readVectorData(String filePath);

void insertVectors(String collectionName, List<List<Float>> vectorList) ;

}

导入初始数据

导入数据时,直接使用测试文件中的imprtData方法(记得改变csv文件路径为本机路径)即可。

1
2
3
4
5
6
7
8
9
10
@Test // 导入数据使用该方法
void importData()
{
String path = "D:\\desktop\\python\\BigData\\handle_data\\features.csv";
String collectionName = "linkedpaper";
milvusService.create(collectionName,"CREATION");
milvusService.createIndex(collectionName);
List<List<Float>> vectorList= milvusService.readVectorData(path);
milvusService.insertVectors("linkedpaper",vectorList);
}

原理:通过java-stream进行快速读入,然后分批对部署的milvus进行向量插入,速度很快。

查询近似向量

对paperService的findSimilar方法进行了实现,直接调用即可。

原理:先通过id找到对应paper的向量,然后通过向量在数据库中寻找最相近的前K个向量,返回对应的id即可。是通过欧氏距离(L2)来度量相似性的。

  • Title: 记录一次向量数据库的部署过程
  • Author: HangYF
  • Created at : 2025-02-17 14:15:45
  • Updated at : 2025-02-17 22:14:24
  • Link: https://redefine.ohevan.com/2025/02/17/记录一次向量数据库的部署过程/
  • License: This work is licensed under CC BY-NC-SA 4.0.