部署
使用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> <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)来度量相似性的。