mirror of
https://gitee.com/dromara/MilvusPlus.git
synced 2025-12-06 17:08:27 +08:00
!51 发布 2.2.4:更新 sdk 2.5.5,更新日志打印,通过spi支持选择log4j、logback等
Merge pull request !51 from xgc/dev
This commit is contained in:
commit
3976aa6eec
@ -8,7 +8,7 @@
|
|||||||
<img src="./logo/milvus.png" alt="MilvusPlus" style="border-radius: 10px;" />
|
<img src="./logo/milvus.png" alt="MilvusPlus" style="border-radius: 10px;" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
> 🔥🔥🔥[MilvusPlus](https://milvusplus.cn/)(简称 MP)是一个 [Milvus](https://milvus.io) 的操作工具,旨在简化与 Milvus 向量数据库的交互,为开发者提供类似 MyBatis-Plus 注解和方法调用风格的直观 API,提高效率而生。
|
> 🔥🔥🔥[MilvusPlus](https://milvus-plus.dromara.org)(简称 MP)是一个 [Milvus](https://milvus.io) 的操作工具,旨在简化与 Milvus 向量数据库的交互,为开发者提供类似 MyBatis-Plus 注解和方法调用风格的直观 API,提高效率而生。
|
||||||
|
|
||||||
## 特性
|
## 特性
|
||||||
|
|
||||||
@ -31,7 +31,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.milvus-plus</groupId>
|
<groupId>org.dromara.milvus-plus</groupId>
|
||||||
<artifactId>milvus-plus-core</artifactId>
|
<artifactId>milvus-plus-core</artifactId>
|
||||||
<version>2.2.3</version>
|
<version>2.2.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ Spring应用支持:
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.milvus-plus</groupId>
|
<groupId>org.dromara.milvus-plus</groupId>
|
||||||
<artifactId>milvus-plus-boot-starter</artifactId>
|
<artifactId>milvus-plus-boot-starter</artifactId>
|
||||||
<version>2.2.3</version>
|
<version>2.2.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ Solon应用支持:
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.milvus-plus</groupId>
|
<groupId>org.dromara.milvus-plus</groupId>
|
||||||
<artifactId>milvus-plus-solon-plugin</artifactId>
|
<artifactId>milvus-plus-solon-plugin</artifactId>
|
||||||
<version>2.2.3</version>
|
<version>2.2.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
<img src="./logo/milvus.png" alt="MilvusPlus" style="border-radius: 10px;" />
|
<img src="./logo/milvus.png" alt="MilvusPlus" style="border-radius: 10px;" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
> 🔥🔥🔥 [MilvusPlus](https://milvusplus.cn/) (short for MP) is an operational tool for [Milvus](https://milvus.io), designed to simplify interactions with the Milvus vector database, providing developers with an intuitive API similar to MyBatis-Plus annotations and method call style, born to improve efficiency.
|
> 🔥🔥🔥 [MilvusPlus](https://milvus-plus.dromara.org) (short for MP) is an operational tool for [Milvus](https://milvus.io), designed to simplify interactions with the Milvus vector database, providing developers with an intuitive API similar to MyBatis-Plus annotations and method call style, born to improve efficiency.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
@ -29,7 +29,7 @@ Custom extension support:
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.milvus-plus</groupId>
|
<groupId>org.dromara.milvus-plus</groupId>
|
||||||
<artifactId>milvus-plus-core</artifactId>
|
<artifactId>milvus-plus-core</artifactId>
|
||||||
<version>2.2.3</version>
|
<version>2.2.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ Spring application support:
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.milvus-plus</groupId>
|
<groupId>org.dromara.milvus-plus</groupId>
|
||||||
<artifactId>milvus-plus-boot-starter</artifactId>
|
<artifactId>milvus-plus-boot-starter</artifactId>
|
||||||
<version>2.2.3</version>
|
<version>2.2.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ Solon application support:
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.milvus-plus</groupId>
|
<groupId>org.dromara.milvus-plus</groupId>
|
||||||
<artifactId>milvus-plus-solon-plugin</artifactId>
|
<artifactId>milvus-plus-solon-plugin</artifactId>
|
||||||
<version>2.2.3</version>
|
<version>2.2.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -28,7 +28,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.milvus</groupId>
|
<groupId>io.milvus</groupId>
|
||||||
<artifactId>milvus-sdk-java</artifactId>
|
<artifactId>milvus-sdk-java</artifactId>
|
||||||
<version>2.5.2</version>
|
<version>2.5.5</version>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.apache.logging.log4j</groupId>
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
|||||||
@ -0,0 +1,43 @@
|
|||||||
|
package org.dromara.milvus.plus.log;
|
||||||
|
|
||||||
|
import org.dromara.milvus.plus.log.spi.LogFrameworkAdapter;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ServiceLoader;
|
||||||
|
|
||||||
|
public class LogAdapterFactory {
|
||||||
|
private static volatile LogFrameworkAdapter cachedAdapter;
|
||||||
|
|
||||||
|
public static LogFrameworkAdapter getAdapter() {
|
||||||
|
if (cachedAdapter == null) {
|
||||||
|
synchronized (LogAdapterFactory.class) {
|
||||||
|
if (cachedAdapter == null) {
|
||||||
|
ServiceLoader<LogFrameworkAdapter> loader = ServiceLoader.load(LogFrameworkAdapter.class);
|
||||||
|
List<LogFrameworkAdapter> adapters = new ArrayList<>();
|
||||||
|
|
||||||
|
for (LogFrameworkAdapter adapter : loader) {
|
||||||
|
if (adapter.isSupported()) {
|
||||||
|
adapters.add(adapter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adapters.isEmpty()) {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"No supported logging framework found! Please add one of:\n" +
|
||||||
|
"- Logback: ch.qos.logback:logback-classic\n" +
|
||||||
|
"- Log4j2: org.apache.logging.log4j:log4j-core + log4j-slf4j2-impl\n" +
|
||||||
|
"- JUL: JDK built-in (no extra dependencies needed)"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 按优先级排序
|
||||||
|
adapters.sort(Comparator.comparingInt(LogFrameworkAdapter::getPriority));
|
||||||
|
cachedAdapter = adapters.get(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cachedAdapter;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
package org.dromara.milvus.plus.log;
|
||||||
|
|
||||||
|
import org.dromara.milvus.plus.log.spi.LogFrameworkAdapter;
|
||||||
|
|
||||||
|
public class LogContext {
|
||||||
|
private static final LogFrameworkAdapter ADAPTER = LogAdapterFactory.getAdapter();
|
||||||
|
|
||||||
|
public static void setLogLevel(String packageName, String level) {
|
||||||
|
ADAPTER.setLogLevel(packageName, level);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setLoggingEnabled(String packageName, boolean enabled, String level) {
|
||||||
|
setLogLevel(packageName, enabled ? level : "OFF");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,41 +1,11 @@
|
|||||||
package org.dromara.milvus.plus.log;
|
package org.dromara.milvus.plus.log;
|
||||||
|
|
||||||
import ch.qos.logback.classic.Level;
|
|
||||||
import ch.qos.logback.classic.LoggerContext;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
public class LogLevelController {
|
public class LogLevelController {
|
||||||
|
public static void setLogLevelForPackage(String packageName, String level) {
|
||||||
// 获取LoggerContext
|
LogContext.setLogLevel(packageName, level);
|
||||||
private static final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置特定包下所有类的日志级别。
|
|
||||||
*
|
|
||||||
* @param packageName 包名
|
|
||||||
* @param level 日志级别
|
|
||||||
*/
|
|
||||||
public static void setLogLevelForPackage(String packageName, Level level) {
|
|
||||||
for (ch.qos.logback.classic.Logger logger : loggerContext.getLoggerList()) {
|
|
||||||
if (logger.getName().startsWith(packageName)) {
|
|
||||||
logger.setLevel(level);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 动态设置日志开关。
|
|
||||||
* 当设置为Level.OFF时,等同于关闭日志。
|
|
||||||
*
|
|
||||||
* @param packageName 包名
|
|
||||||
* @param enabled 是否启用日志
|
|
||||||
*/
|
|
||||||
public static void setLoggingEnabledForPackage(String packageName, boolean enabled, String level) {
|
public static void setLoggingEnabledForPackage(String packageName, boolean enabled, String level) {
|
||||||
// 开启日志 默认 -> debug
|
LogContext.setLoggingEnabled(packageName, enabled, level);
|
||||||
if (enabled) {
|
|
||||||
setLogLevelForPackage(packageName, Level.toLevel(level, Level.DEBUG));
|
|
||||||
} else {
|
|
||||||
setLogLevelForPackage(packageName, Level.OFF);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
// LogFrameworkAdapter.java
|
||||||
|
package org.dromara.milvus.plus.log.spi;
|
||||||
|
|
||||||
|
public interface LogFrameworkAdapter {
|
||||||
|
/**
|
||||||
|
* 适配器优先级(数值越小优先级越高)
|
||||||
|
*/
|
||||||
|
int getPriority();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否支持当前日志框架
|
||||||
|
*/
|
||||||
|
boolean isSupported();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置指定包的日志级别
|
||||||
|
*/
|
||||||
|
void setLogLevel(String packageName, String level);
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
package org.dromara.milvus.plus.log.spi.impl;
|
||||||
|
|
||||||
|
import org.dromara.milvus.plus.log.spi.LogFrameworkAdapter;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
@Service
|
||||||
|
public class JulAdapter implements LogFrameworkAdapter {
|
||||||
|
@Override
|
||||||
|
public int getPriority() {
|
||||||
|
return 3; // 最低优先级
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSupported() {
|
||||||
|
return true; // JUL 始终可用
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setLogLevel(String packageName, String level) {
|
||||||
|
Logger logger = Logger.getLogger(packageName);
|
||||||
|
logger.setLevel(Level.parse(level));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
package org.dromara.milvus.plus.log.spi.impl;
|
||||||
|
|
||||||
|
import org.dromara.milvus.plus.log.spi.LogFrameworkAdapter;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
@Service
|
||||||
|
public class Log4j2Adapter implements LogFrameworkAdapter {
|
||||||
|
@Override
|
||||||
|
public int getPriority() {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSupported() {
|
||||||
|
try {
|
||||||
|
Class.forName("org.apache.logging.log4j.core.config.Configurator");
|
||||||
|
return true;
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setLogLevel(String packageName, String level) {
|
||||||
|
try {
|
||||||
|
Class<?> configuratorClass = Class.forName("org.apache.logging.log4j.core.config.Configurator");
|
||||||
|
Class<?> levelClass = Class.forName("org.apache.logging.log4j.Level");
|
||||||
|
|
||||||
|
// 缓存反射方法提升性能
|
||||||
|
Method toLevelMethod = levelClass.getMethod("toLevel", String.class);
|
||||||
|
Object logLevel = toLevelMethod.invoke(null, level);
|
||||||
|
|
||||||
|
Method setLevelMethod = configuratorClass.getMethod("setLevel", String.class, levelClass);
|
||||||
|
setLevelMethod.invoke(null, packageName, logLevel);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IllegalStateException("[Log4j2] Set log level failed: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
package org.dromara.milvus.plus.log.spi.impl;
|
||||||
|
|
||||||
|
import org.dromara.milvus.plus.log.spi.LogFrameworkAdapter;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
@Service
|
||||||
|
public class LogbackAdapter implements LogFrameworkAdapter {
|
||||||
|
@Override
|
||||||
|
public int getPriority() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSupported() {
|
||||||
|
try {
|
||||||
|
// 检测关键类是否存在,避免直接导入
|
||||||
|
Class.forName("ch.qos.logback.classic.Logger");
|
||||||
|
Class.forName("ch.qos.logback.classic.Level");
|
||||||
|
return true;
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setLogLevel(String packageName, String level) {
|
||||||
|
try {
|
||||||
|
// 反射获取 Logback 相关类和方法
|
||||||
|
Class<?> loggerContextClass = Class.forName("ch.qos.logback.classic.LoggerContext");
|
||||||
|
Class<?> levelClass = Class.forName("ch.qos.logback.classic.Level");
|
||||||
|
|
||||||
|
// 获取 Level.toLevel 方法
|
||||||
|
Method toLevelMethod = levelClass.getMethod("toLevel", String.class);
|
||||||
|
Object logLevel = toLevelMethod.invoke(null, level);
|
||||||
|
|
||||||
|
// 获取 LoggerContext 实例
|
||||||
|
Object loggerContext = LoggerFactory.getILoggerFactory();
|
||||||
|
if (!loggerContextClass.isInstance(loggerContext)) {
|
||||||
|
throw new IllegalStateException("LoggerFactory is not Logback");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 调用 LoggerContext.getLoggerList()
|
||||||
|
Method getLoggerListMethod = loggerContextClass.getMethod("getLoggerList");
|
||||||
|
Iterable<?> loggers = (Iterable<?>) getLoggerListMethod.invoke(loggerContext);
|
||||||
|
|
||||||
|
// 遍历并设置日志级别
|
||||||
|
for (Object logger : loggers) {
|
||||||
|
Method getNameMethod = logger.getClass().getMethod("getName");
|
||||||
|
String name = (String) getNameMethod.invoke(logger);
|
||||||
|
if (name.startsWith(packageName)) {
|
||||||
|
Method setLevelMethod = logger.getClass().getMethod("setLevel", levelClass);
|
||||||
|
setLevelMethod.invoke(logger, logLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IllegalStateException("[Logback] Set log level failed: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
org.dromara.milvus.plus.log.spi.impl.LogbackAdapter
|
||||||
|
org.dromara.milvus.plus.log.spi.impl.Log4j2Adapter
|
||||||
|
org.dromara.milvus.plus.log.spi.impl.JulAdapter
|
||||||
@ -30,7 +30,7 @@
|
|||||||
</developer>
|
</developer>
|
||||||
</developers>
|
</developers>
|
||||||
<properties>
|
<properties>
|
||||||
<revision>2.2.4-M1</revision>
|
<revision>2.2.4</revision>
|
||||||
<maven.compiler.source>${java.version}</maven.compiler.source>
|
<maven.compiler.source>${java.version}</maven.compiler.source>
|
||||||
<maven.compiler.target>${java.version}</maven.compiler.target>
|
<maven.compiler.target>${java.version}</maven.compiler.target>
|
||||||
<maven-compiler.version>3.11.0</maven-compiler.version>
|
<maven-compiler.version>3.11.0</maven-compiler.version>
|
||||||
|
|||||||
@ -119,9 +119,9 @@ public class ApplicationRunnerTest implements ApplicationRunner {
|
|||||||
person.setImages(Lists.newArrayList("https://baidu.com"));
|
person.setImages(Lists.newArrayList("https://baidu.com"));
|
||||||
faceTmp.setPerson(person);
|
faceTmp.setPerson(person);
|
||||||
faceTmp.setTemp(i%2==0?11:22);
|
faceTmp.setTemp(i%2==0?11:22);
|
||||||
faceTmp.setText(i % 2 == 0 ?"nformation retrieval is a field of study.":"information retrieval focuses on finding relevant information in large datasets.");
|
// faceTmp.setText(i % 2 == 0 ?"nformation retrieval is a field of study.":"information retrieval focuses on finding relevant information in large datasets.");
|
||||||
faceTmp.setAge(10);
|
// faceTmp.setAge(10);
|
||||||
faceTmp.setSex("男");
|
// faceTmp.setSex("男");
|
||||||
return faceTmp;
|
return faceTmp;
|
||||||
})
|
})
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|||||||
@ -38,13 +38,13 @@ public class Face {
|
|||||||
)
|
)
|
||||||
private Integer temp;
|
private Integer temp;
|
||||||
|
|
||||||
@MilvusField(
|
// @MilvusField(
|
||||||
name = "text",
|
// name = "text",
|
||||||
dataType = DataType.VarChar,
|
// dataType = DataType.VarChar,
|
||||||
enableAnalyzer = true,
|
// enableAnalyzer = true,
|
||||||
enableMatch = true
|
// enableMatch = true
|
||||||
)
|
// )
|
||||||
private String text; // 文本
|
// private String text; // 文本
|
||||||
|
|
||||||
@MilvusField(
|
@MilvusField(
|
||||||
name = "face_vector", // 字段名称
|
name = "face_vector", // 字段名称
|
||||||
@ -62,11 +62,11 @@ public class Face {
|
|||||||
private List<Float> faceVector; // 存储人脸特征的向量
|
private List<Float> faceVector; // 存储人脸特征的向量
|
||||||
|
|
||||||
|
|
||||||
//后续添加
|
// //后续添加
|
||||||
|
//
|
||||||
private String sex;
|
// private String sex;
|
||||||
|
//
|
||||||
|
//
|
||||||
private Integer age;
|
// private Integer age;
|
||||||
|
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user