mirror of
https://gitee.com/dromara/MilvusPlus.git
synced 2025-12-07 17:38:24 +08:00
!13 MilvusCollection注解支持配置别名
Merge pull request !13 from GhostGuest/future-alias-support
This commit is contained in:
commit
3178dede4f
@ -15,4 +15,9 @@ public @interface MilvusCollection {
|
|||||||
* 集合的名称
|
* 集合的名称
|
||||||
*/
|
*/
|
||||||
String name();
|
String name();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
String[] alias() default {};
|
||||||
}
|
}
|
||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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", // 字段名称
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user