!13 MilvusCollection注解支持配置别名

Merge pull request !13 from GhostGuest/future-alias-support
This commit is contained in:
xgc 2024-06-06 03:09:00 +00:00 committed by Gitee
commit 3178dede4f
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
6 changed files with 103 additions and 13 deletions

View File

@ -15,4 +15,9 @@ public @interface MilvusCollection {
* 集合的名称
*/
String name();
/**
*
*/
String[] alias() default {};
}

View File

@ -48,11 +48,12 @@ public class MilvusConverter {
return cache.getMilvusEntity();
}
MilvusEntity milvus = new MilvusEntity();
// 获取实体类上的@MilvusCollection注解校验其存在性
// 集合名称
MilvusCollection collectionAnnotation = entityClass.getAnnotation(MilvusCollection.class);
if (Objects.isNull(collectionAnnotation)) {
throw new IllegalArgumentException("Entity must be annotated with @MilvusCollection");
}
// 分区信息
MilvusPartition milvusPartition = entityClass.getAnnotation(MilvusPartition.class);
if (Objects.nonNull(milvusPartition)) {
String[] name = milvusPartition.name();
@ -60,9 +61,14 @@ public class MilvusConverter {
} else {
milvus.setPartitionName(Lists.newArrayList());
}
// 从注解中读取集合名称
// 集合名称
String collectionName = collectionAnnotation.name();
milvus.setCollectionName(collectionName);
// 集合别名
if (collectionAnnotation.alias().length > 0) {
milvus.setAlias(Arrays.asList(collectionAnnotation.alias()));
}
// 初始化字段列表和索引参数列表
List<AddFieldReq> milvusFields = new ArrayList<>();
List<IndexParam> indexParams = new ArrayList<>();
@ -175,11 +181,12 @@ public class MilvusConverter {
}
return original.substring(0, 1).toUpperCase() + original.substring(1);
}
public static void create(MilvusEntity milvusEntity, MilvusClientV2 client){
List<IndexParam> indexParams = milvusEntity.getIndexParams();
if(indexParams==null||indexParams.isEmpty()){
throw new IllegalArgumentException("the index does not exist, please define the index");
}
public static void create(MilvusEntity milvusEntity, MilvusClientV2 client) {
List<IndexParam> indexParams = milvusEntity.getIndexParams();
if (indexParams == null || indexParams.isEmpty()) {
throw new IllegalArgumentException("the index does not exist, please define the index");
}
// 创建新集合
CollectionSchemaBuilder schemaBuilder = new CollectionSchemaBuilder(
milvusEntity.getCollectionName(), client

View File

@ -5,12 +5,14 @@ import io.milvus.v2.service.collection.request.AddFieldReq;
import lombok.Data;
import java.util.List;
/**
* @author xgc
**/
@Data
public class MilvusEntity {
private String collectionName;
private List<String> alias;
private List<IndexParam> indexParams;
private List<AddFieldReq> milvusFields;
private List<String> partitionName;

View File

@ -3,10 +3,14 @@ package org.dromara.milvus.plus.service;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.ReleaseCollectionReq;
import io.milvus.v2.service.utility.response.ListAliasResp;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.dromara.milvus.plus.annotation.MilvusCollection;
import org.dromara.milvus.plus.cache.CollectionToPrimaryCache;
import org.dromara.milvus.plus.converter.MilvusConverter;
import org.dromara.milvus.plus.model.MilvusEntity;
import org.dromara.milvus.plus.model.MilvusProperties;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
@ -48,7 +52,7 @@ public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder
@Override
public void close() throws InterruptedException {
if (client != null) {
//释放集合+释放client
// 释放集合+释放client
Set<String> co = CollectionToPrimaryCache.collectionToPrimary.keySet();
if (!co.isEmpty()) {
for (String name : co) {
@ -77,7 +81,7 @@ public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder
return client;
}
//获取指定包下实体类
// 获取指定包下实体类
private List<Class<?>> getClass(List<String> packages) {
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
return Optional.ofNullable(packages)
@ -107,10 +111,30 @@ public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder
.collect(Collectors.toList());
}
//缓存 + 是否构建集合
// 缓存 + 是否构建集合
public void performBusinessLogic(List<Class<?>> annotatedClasses) {
for (Class<?> milvusClass : annotatedClasses) {
createCollection(milvusClass);
MilvusEntity milvusEntity = MilvusConverter.convert(milvusClass);
createCollection(milvusEntity);
aliasProcess(milvusEntity);
}
}
private void aliasProcess(MilvusEntity milvusEntity) {
if (StringUtils.isBlank(milvusEntity.getCollectionName()) || milvusEntity.getAlias().isEmpty()) {
return;
}
ListAliasResp listAliasResp = listAliases(milvusEntity);
Optional.ofNullable(listAliasResp)
.ifPresent(aliasInfo -> {
// 获取不存在的别名
List<String> aliasList = milvusEntity.getAlias().stream()
.filter(e -> !aliasInfo.getAlias().contains(e))
.filter(StringUtils::isNotBlank)
.collect(Collectors.toList());
log.info("processing alias: {}", aliasList);
milvusEntity.setAlias(aliasList);
createAlias(milvusEntity);
});
}
}

View File

@ -11,6 +11,11 @@ import io.milvus.v2.service.index.request.DescribeIndexReq;
import io.milvus.v2.service.index.request.DropIndexReq;
import io.milvus.v2.service.index.response.DescribeIndexResp;
import io.milvus.v2.service.partition.request.*;
import io.milvus.v2.service.utility.request.AlterAliasReq;
import io.milvus.v2.service.utility.request.CreateAliasReq;
import io.milvus.v2.service.utility.request.DropAliasReq;
import io.milvus.v2.service.utility.request.ListAliasesReq;
import io.milvus.v2.service.utility.response.ListAliasResp;
import org.apache.commons.lang3.StringUtils;
import org.dromara.milvus.plus.builder.CollectionSchemaBuilder;
import org.dromara.milvus.plus.converter.MilvusConverter;
@ -423,5 +428,52 @@ public interface ICMService {
releasePartitions(collectionName, Collections.singletonList(partitionName));
}
/**
* create aliases
*/
default void createAlias(MilvusEntity milvusEntity) {
MilvusClientV2 client = getClient();
for (String alias : milvusEntity.getAlias()) {
CreateAliasReq createAliasReq = CreateAliasReq.builder().alias(alias)
.collectionName(milvusEntity.getCollectionName()).build();
client.createAlias(createAliasReq);
}
}
default void createAlias(Class<?> milvusClass) {
MilvusEntity milvusEntity = MilvusConverter.convert(milvusClass);
createAlias(milvusEntity);
}
/**
* drop aliases
*/
default void dropAlias(MilvusEntity milvusEntity) {
MilvusClientV2 client = getClient();
for (String alias : milvusEntity.getAlias()) {
client.dropAlias(DropAliasReq.builder().alias(alias).build());
}
}
/**
* alter aliases
*/
default void alterAlias(MilvusEntity milvusEntity) {
MilvusClientV2 client = getClient();
for (String alias : milvusEntity.getAlias()) {
client.alterAlias(AlterAliasReq.builder()
.collectionName(milvusEntity.getCollectionName())
.alias(alias).build());
}
}
/**
* list aliases
*
* @return List<String> alias names
*/
default ListAliasResp listAliases(MilvusEntity milvusEntity) {
MilvusClientV2 client = getClient();
return client.listAliases(ListAliasesReq.builder().collectionName(milvusEntity.getCollectionName()).build());
}
}

View File

@ -8,8 +8,8 @@ import org.dromara.milvus.plus.annotation.*;
import java.util.List;
@Data
@MilvusCollection(name = "face_collection") // 指定Milvus集合的名称
@MilvusPartition(name = {"face_001","face_002"})
@MilvusCollection(name = "face_collection", alias = {"alias_face"})
@MilvusPartition(name = {"face_001", "face_002"})
public class Face {
@MilvusField(
name = "person_id", // 字段名称