!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 name();
/**
*
*/
String[] alias() default {};
} }

View File

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

View File

@ -5,12 +5,14 @@ import io.milvus.v2.service.collection.request.AddFieldReq;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
/** /**
* @author xgc * @author xgc
**/ **/
@Data @Data
public class MilvusEntity { public class MilvusEntity {
private String collectionName; private String collectionName;
private List<String> alias;
private List<IndexParam> indexParams; private List<IndexParam> indexParams;
private List<AddFieldReq> milvusFields; private List<AddFieldReq> milvusFields;
private List<String> partitionName; 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.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2; import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.ReleaseCollectionReq; import io.milvus.v2.service.collection.request.ReleaseCollectionReq;
import io.milvus.v2.service.utility.response.ListAliasResp;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.dromara.milvus.plus.annotation.MilvusCollection; import org.dromara.milvus.plus.annotation.MilvusCollection;
import org.dromara.milvus.plus.cache.CollectionToPrimaryCache; 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.dromara.milvus.plus.model.MilvusProperties;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
@ -48,7 +52,7 @@ public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder
@Override @Override
public void close() throws InterruptedException { public void close() throws InterruptedException {
if (client != null) { if (client != null) {
//释放集合+释放client // 释放集合+释放client
Set<String> co = CollectionToPrimaryCache.collectionToPrimary.keySet(); Set<String> co = CollectionToPrimaryCache.collectionToPrimary.keySet();
if (!co.isEmpty()) { if (!co.isEmpty()) {
for (String name : co) { for (String name : co) {
@ -77,7 +81,7 @@ public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder
return client; return client;
} }
//获取指定包下实体类 // 获取指定包下实体类
private List<Class<?>> getClass(List<String> packages) { private List<Class<?>> getClass(List<String> packages) {
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
return Optional.ofNullable(packages) return Optional.ofNullable(packages)
@ -107,10 +111,30 @@ public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
//缓存 + 是否构建集合 // 缓存 + 是否构建集合
public void performBusinessLogic(List<Class<?>> annotatedClasses) { public void performBusinessLogic(List<Class<?>> annotatedClasses) {
for (Class<?> milvusClass : 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.request.DropIndexReq;
import io.milvus.v2.service.index.response.DescribeIndexResp; import io.milvus.v2.service.index.response.DescribeIndexResp;
import io.milvus.v2.service.partition.request.*; 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.apache.commons.lang3.StringUtils;
import org.dromara.milvus.plus.builder.CollectionSchemaBuilder; import org.dromara.milvus.plus.builder.CollectionSchemaBuilder;
import org.dromara.milvus.plus.converter.MilvusConverter; import org.dromara.milvus.plus.converter.MilvusConverter;
@ -423,5 +428,52 @@ public interface ICMService {
releasePartitions(collectionName, Collections.singletonList(partitionName)); 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; import java.util.List;
@Data @Data
@MilvusCollection(name = "face_collection") // 指定Milvus集合的名称 @MilvusCollection(name = "face_collection", alias = {"alias_face"})
@MilvusPartition(name = {"face_001","face_002"}) @MilvusPartition(name = {"face_001", "face_002"})
public class Face { public class Face {
@MilvusField( @MilvusField(
name = "person_id", // 字段名称 name = "person_id", // 字段名称