🔥🔥🔥MilvusPlus(简称 MP)是一个 Milvus 的操作工具,旨在简化与 Milvus 向量数据库的交互,为开发者提供类似 MyBatis-Plus 注解和方法调用风格的直观 API,提高效率而生。
自定义扩展支持:
<dependency>
<groupId>org.dromara</groupId>
<artifactId>milvus-plus-core</artifactId>
<version>2.1.3</version>
</dependency>
Spring应用支持:
<dependency>
<groupId>org.dromara</groupId>
<artifactId>milvus-plus-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
Solon应用支持:
<dependency>
<groupId>org.dromara</groupId>
<artifactId>milvus-plus-solon-plugin</artifactId>
<version>2.1.3</version>
</dependency>
milvus:
uri: https://in03-a5357975ab80da7.api.gcp-us-west1.zillizcloud.com
token: x'x'x'x
enable: true
open-log: true (默认 false 不打印)
db-name: (可选)
username: (可选)
password: (可选)
packages:
- com.example.entity
milvus
:定义了与Milvus服务相关的配置。uri
:Milvus服务的URI,应用程序通过这个URI与Milvus服务进行通信。token
:用于验证和授权的令牌(Token),确保访问Milvus服务的安全性。enable
:一个布尔值,用于指示Milvus模块是否应该被启用。packages
:这些包包含了自定义注解对应的Java类,你可以认为这是你自定义的实体类所在的包。使用自定义注解自动化Milvus数据库集成,提供了以下显著优势:
key()
: 参数的键名。value()
: 参数的值。name()
: 集合的名称。name()
: 字段名称,默认为Java字段名。dataType()
: 数据类型,默认为FLOAT_VECTOR
。dimension()
: 向量维度,默认为-1。isPrimaryKey()
: 是否为主键,默认为false。autoID()
: 是否自动生成ID,默认为false。description()
: 字段描述,默认为空。elementType()
: 元素类型,默认为None
。maxLength()
: 最大长度,默认为-1。maxCapacity()
: 最大容量,默认为-1。isPartitionKey()
: 是否为分区键,默认为false。indexType()
: 索引类型,默认为FLAT
。metricType()
: 度量类型,默认为L2
。indexName()
: 索引名称,默认为空。extraParams()
: 额外参数,使用ExtraParam
注解定义。name()
: 分区的名称数组。通过这些注解,开发者可以轻松地定义和管理Milvus数据库的结构,实现项目启动时自动构建所需数据库结构的目标。
MilvusMapper
是一个用于操作 Milvus 数据库的通用接口,提供了一系列的数据操作方法,包括查询、删除、更新和插入。以下是对 MilvusMapper
及其相关类的功能描述:
MilvusMapper
是一个泛型抽象类,继承自 BaseMilvusMapper
,提供了与 Milvus 客户端交互的基本方法。
getClient()
- 返回 MilvusClientV2
实例。BaseMilvusMapper
是一个抽象类,定义了与 Milvus 数据库交互的基础操作。
queryWrapper()
- 创建 LambdaQueryWrapper
实例。deleteWrapper()
- 创建 LambdaDeleteWrapper
实例。updateWrapper()
- 创建 LambdaUpdateWrapper
实例。insertWrapper()
- 创建 LambdaInsertWrapper
实例。getById(Serializable ... ids)
功能
:根据提供的ID列表查询数据。
参数
:ids
- 一个可序列化的ID列表。
返回
:MilvusResp<List<MilvusResult<T>>>
- 包含查询结果的响应。
removeById(Serializable ... ids)
功能
:根据提供的ID列表删除数据。
参数
:ids
- 一个可序列化的ID列表。
返回
:MilvusResp<DeleteResp>
- 删除操作的响应。
updateById(T ... entity)
功能
:根据提供的实体更新数据。
参数
:entity
- 一个实体对象列表。
返回
:MilvusResp<UpsertResp>
- 更新操作的响应。
insert(T ... entity)
功能
:插入提供的实体到数据库。
参数
:entity
- 一个实体对象列表。
返回
:MilvusResp<InsertResp>
- 插入操作的响应。
lambda(Wrapper<W, T> wrapper)
- 初始化并返回构建器实例。LambdaQueryWrapper<T>
是一个用于构建和执行 Milvus 搜索查询的构建器类。它提供了一系列方法来设置查询参数,并最终执行查询。
searchParams(Map<String, Object> searchParams): 设置搜索参数。
以下是 searchParams 支持的参数及其说明:
Map<String, Object> searchParams = new HashMap<>();
searchParams.put("metric_type", "L2");
searchParams.put("radius", 0.5f);
searchParams.put("range_filter", 0.3f);
MilvusResp
对象,其中包含查询结果。LambdaQueryWrapper<T>
类提供了丰富的方法来构建复杂的搜索查询,支持各种条件、逻辑操作、JSON 和数组操作,以及向量搜索。通过链式调用这些方法,用户可以灵活地构造搜索请求并获取所需的查询结果。
LambdaDeleteWrapper
是一个构建器类,用于构建和执行删除操作。
partition(String partitionName)
eq(String fieldName, Object value)
ne(String fieldName, Object value)
id(Object id)
remove()
- 构建并执行删除请求。removeById(Serializable ... ids)
LambdaUpdateWrapper
是一个构建器类,用于构建和执行更新操作。
partition(String partitionName)
LambdaDeleteWrapper
相同update(T t)
- 构建并执行更新请求。updateById(T ... t)
LambdaInsertWrapper
是一个构建器类,用于构建和执行插入操作。
partition(String partitionName)
put(String fieldName, Object value)
insert()
- 构建并执行插入请求。insert(T ... t)
MilvusService
是一个综合性服务,提供对 Milvus 数据库的全面管理,它实现了多个接口:IAMService
(身份访问管理服务)、ICMService
(集合管理服务)和 IVecMService
(向量管理服务)。
IAMService
接口提供用户和角色的创建、删除、查询以及权限的授予和撤销等功能。
createRole(String roleName)
createUser(String userName, String password)
describeRole(String roleName)
describeUser(String userName)
dropRole(String roleName)
dropUser(String userName)
grantPrivilege(String roleName, String objectType, String privilege, String objectName)
grantRole(String roleName, String userName)
listRoles()
listUsers()
revokePrivilege(String roleName, String objectType, String privilege, String objectName, String databaseName)
revokeRole(String roleName, String userName)
updatePassword(String userName, String password, String newPassword)
ICMService
接口提供集合的创建、删除、查询、重命名、索引创建和管理等功能。
createCollection(MilvusEntity milvusEntity)
addField(String collectionName, AddFieldReq ... addFieldReq)
getField(String collectionName, String fieldName)
describeCollection(String collectionName)
dropCollection(String collectionName)
hasCollection(String collectionName)
getCollectionStats(String collectionName)
renameCollection(String oldCollectionName, String newCollectionName)
createIndex(String collectionName, List<IndexParam> indexParams)
describeIndex(String collectionName, String fieldName)
dropIndex(String collectionName, String fieldName)
getLoadState(String collectionName, String partitionName)
loadCollection(String collectionName)
releaseCollection(String collectionName)
createPartition(String collectionName, String partitionName)
dropPartition(String collectionName, String partitionName)
hasPartition(String collectionName, String partitionName)
listPartitions(String collectionName)
loadPartitions(String collectionName, List<String> partitionNames)
releasePartitions(String collectionName, List<String> partitionNames)
IVecMService
接口提供向量的插入、更新、查询、删除以及相似性搜索等功能。
delete(String collectionName, String partitionName, String filter, List<Object> ids)
get(String collectionName, String partitionName, List<Object> ids, List<String> outputFields)
insert(String collectionName, List<JSONObject> data, String partitionName)
query(String collectionName, List<String> partitionNames, List<String> outputFields, List<Object> ids, String filter, ConsistencyLevel consistencyLevel, long offset, long limit)
search(String collectionName, List<String> partitionNames, String annsField, int topK, String filter, List<String> outputFields, List<Object> data, long offset, long limit, int roundDecimal, Map<String, Object> searchParams, long guaranteeTimestamp, long gracefulTime, ConsistencyLevel consistencyLevel, boolean ignoreGrowing)
upsert(String collectionName, String partitionName, List<JSONObject> data)
除了上述功能,MilvusService
还提供了一个公共方法来获取 MilvusClientV2
实例:
以下是使用 MilvusPlus 进行向量搜索的示例:
@Data
@MilvusCollection(name = "face_collection") // 指定Milvus集合的名称
public class Face {
@MilvusField(
name = "person_id", // 字段名称
dataType = DataType.Int64, // 数据类型为64位整数
isPrimaryKey = true, // 标记为主键
)
private Long personId; // 人员的唯一标识符
@MilvusField(
name = "face_vector", // 字段名称
dataType = DataType.FloatVector, // 数据类型为浮点型向量
dimension = 128, // 向量维度,假设人脸特征向量的维度是128
)
@MilvusIndex(
indexType = IndexParam.IndexType.IVF_FLAT, // 使用IVF_FLAT索引类型
metricType = IndexParam.MetricType.L2, // 使用L2距离度量类型
indexName = "face_index", // 索引名称
extraParams = { // 指定额外的索引参数
@ExtraParam(key = "nlist", value = "100") // 例如,IVF的nlist参数
}
)
private List<Float> faceVector; // 存储人脸特征的向量
}
@Component
public class FaceMilvusMapper extends MilvusMapper<Face> {
}
@Component
@Slf4j
public class ApplicationRunnerTest implements ApplicationRunner {
private final FaceMilvusMapper mapper;
public ApplicationRunnerTest(FaceMilvusMapper mapper) {
this.mapper = mapper;
}
@Override
public void run(ApplicationArguments args){
Face face=new Face();
List<Float> vector = new ArrayList<>();
for (int i = 0; i < 128; i++) {
vector.add((float) (Math.random() * 100)); // 这里仅作为示例使用随机数
}
face.setPersonId(1l);
face.setFaceVector(vector);
//新增
List<Face> faces=new ArrayList<>();
for (int i = 1; i < 10 ;i++){
Face face1=new Face();
face1.setPersonId(Long.valueOf(i));
List<Float> vector1 = new ArrayList<>();
for (int j = 0; j < 128; j++) {
vector1.add((float) (Math.random() * 100)); // 这里仅作为示例使用随机数
}
face1.setFaceVector(vector1);
faces.add(face1);
}
MilvusResp<InsertResp> insert = mapper.insert(faces.toArray(faces.toArray(new Face[0]))); log.info("insert--{}", JSONObject.toJSONString(insert));
//id查询
MilvusResp<List<MilvusResult<Face>>> query = mapper.getById(9l);
log.info("query--getById---{}", JSONObject.toJSONString(query));
//向量查询
MilvusResp<List<MilvusResult<Face>>> query1 = mapper.queryWrapper()
.vector(Face::getFaceVector, vector)
.ne(Face::getPersonId, 1L)
.topK(3)
.query();
log.info("向量查询 query--queryWrapper---{}", JSONObject.toJSONString(query1));
//标量查询
MilvusResp<List<MilvusResult<Face>>> query2 = mapper.queryWrapper()
.eq(Face::getPersonId, 2L)
.limit(3)
.query();
log.info("标量查询 query--queryWrapper---{}", JSONObject.toJSONString(query2));
//更新
vector.clear();
for (int i = 0; i < 128; i++) {
vector.add((float) (Math.random() * 100)); // 这里仅作为示例使用随机数
}
MilvusResp<UpsertResp> update = mapper.updateById(face);log.info("update--{}", JSONObject.toJSONString(update));
//id查询
MilvusResp<List<MilvusResult<Face>>> query3 = mapper.getById(1L);log.info("query--getById---{}", JSONObject.toJSONString(query3));
//删除
MilvusResp<DeleteResp> remove = mapper.removeById(1L);log.info("remove--{}", JSONObject.toJSONString(remove));
//查询
MilvusResp<List<MilvusResult<Face>>> query4 = mapper.getById(1L);log.info("query--{}", JSONObject.toJSONString(query4));
}
}
如有问题或需要支持,请联系 javpower@163.com 。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。