mirror of
https://gitee.com/dromara/MilvusPlus.git
synced 2025-12-07 01:18:23 +08:00
commit
80eb9abb55
@ -31,7 +31,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
<artifactId>milvus-plus-core</artifactId>
|
<artifactId>milvus-plus-core</artifactId>
|
||||||
<version>2.1.4</version>
|
<version>2.1.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ Spring应用支持:
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
<artifactId>milvus-plus-boot-starter</artifactId>
|
<artifactId>milvus-plus-boot-starter</artifactId>
|
||||||
<version>2.1.4</version>
|
<version>2.1.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ Solon应用支持:
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
<artifactId>milvus-plus-solon-plugin</artifactId>
|
<artifactId>milvus-plus-solon-plugin</artifactId>
|
||||||
<version>2.1.4</version>
|
<version>2.1.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -29,7 +29,7 @@ Custom extension support:
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
<artifactId>milvus-plus-core</artifactId>
|
<artifactId>milvus-plus-core</artifactId>
|
||||||
<version>2.1.4</version>
|
<version>2.1.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ Spring application support:
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
<artifactId>milvus-plus-boot-starter</artifactId>
|
<artifactId>milvus-plus-boot-starter</artifactId>
|
||||||
<version>2.1.4</version>
|
<version>2.1.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ Solon application support:
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
<artifactId>milvus-plus-solon-plugin</artifactId>
|
<artifactId>milvus-plus-solon-plugin</artifactId>
|
||||||
<version>2.1.4</version>
|
<version>2.1.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -17,7 +17,7 @@ public class JavaTest {
|
|||||||
MilvusProperties properties=new MilvusProperties();
|
MilvusProperties properties=new MilvusProperties();
|
||||||
properties.setEnable(true);
|
properties.setEnable(true);
|
||||||
properties.setUri("https://in03-a5357975ab80da7.api.gcp-us-west1.zillizcloud.com");
|
properties.setUri("https://in03-a5357975ab80da7.api.gcp-us-west1.zillizcloud.com");
|
||||||
properties.setToken("xxx");
|
properties.setToken("6fab5641a3156d2666feba14390e4ef4b6d376b5dce91faed303eec91a4bdb82239b70b29eb252b981daa3170516245818d4ee12");
|
||||||
properties.setPackages(Lists.newArrayList("io.github.javpower.milvus.demo.model"));
|
properties.setPackages(Lists.newArrayList("io.github.javpower.milvus.demo.model"));
|
||||||
MilvusClientBuild build = new MilvusClientBuild(properties);
|
MilvusClientBuild build = new MilvusClientBuild(properties);
|
||||||
build.initialize();
|
build.initialize();
|
||||||
|
|||||||
@ -72,6 +72,11 @@ public class SearchRespConverter {
|
|||||||
List<QueryResp.QueryResult> queryResults = getResp.getQueryResults();
|
List<QueryResp.QueryResult> queryResults = getResp.getQueryResults();
|
||||||
return convertQuery(queryResults, entityType);
|
return convertQuery(queryResults, entityType);
|
||||||
}
|
}
|
||||||
|
public static MilvusResp<Long> convertGetRespToCount(QueryResp getResp) {
|
||||||
|
// 从QueryResp中提取查询结果
|
||||||
|
List<QueryResp.QueryResult> queryResults = getResp.getQueryResults();
|
||||||
|
return convertQueryCount(queryResults);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将Get响应转换为Milvus响应的通用方法。
|
* 将Get响应转换为Milvus响应的通用方法。
|
||||||
@ -130,4 +135,18 @@ public class SearchRespConverter {
|
|||||||
milvusResp.setSuccess(true);
|
milvusResp.setSuccess(true);
|
||||||
return milvusResp;
|
return milvusResp;
|
||||||
}
|
}
|
||||||
|
private static MilvusResp<Long> convertQueryCount(List<QueryResp.QueryResult> getResults){
|
||||||
|
// 初始化转换缓存和属性缓存,用于帮助将查询结果映射到Java实体
|
||||||
|
Long total= 0L;
|
||||||
|
// 遍历每个查询结果,映射到对应的Java实体
|
||||||
|
for (QueryResp.QueryResult queryResult : getResults) {
|
||||||
|
Map<String, Object> entityMap = queryResult.getEntity();
|
||||||
|
total = (Long) entityMap.get("count(*)");
|
||||||
|
}
|
||||||
|
// 构建并返回一个包含转换结果的MilvusResp对象,标记操作成功
|
||||||
|
MilvusResp<Long> milvusResp = new MilvusResp<>();
|
||||||
|
milvusResp.setData(total);
|
||||||
|
milvusResp.setSuccess(true);
|
||||||
|
return milvusResp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -825,6 +825,7 @@ public class LambdaQueryWrapper<T> extends AbstractChainWrapper<T> implements Wr
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public MilvusResp<List<MilvusResult<T>>> query(FieldFunction<T, ?>... outputFields) throws MilvusException {
|
public MilvusResp<List<MilvusResult<T>>> query(FieldFunction<T, ?>... outputFields) throws MilvusException {
|
||||||
List<String> otf = new ArrayList<>();
|
List<String> otf = new ArrayList<>();
|
||||||
for (FieldFunction<T, ?> outputField : outputFields) {
|
for (FieldFunction<T, ?> outputField : outputFields) {
|
||||||
@ -834,6 +835,24 @@ public class LambdaQueryWrapper<T> extends AbstractChainWrapper<T> implements Wr
|
|||||||
return query();
|
return query();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MilvusResp<Long> count() throws MilvusException {
|
||||||
|
this.outputFields = new ArrayList<>();
|
||||||
|
this.outputFields.add("count(*)");
|
||||||
|
return executeWithRetry(
|
||||||
|
() -> {
|
||||||
|
QueryReq queryReq = buildQuery();
|
||||||
|
log.info("Build Query param--> {}", GsonUtil.toJson(queryReq));
|
||||||
|
QueryResp queryResp = client.query(queryReq);
|
||||||
|
return SearchRespConverter.convertGetRespToCount(queryResp);
|
||||||
|
},
|
||||||
|
"collection not loaded",
|
||||||
|
maxRetries,
|
||||||
|
entityType,
|
||||||
|
client
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public MilvusResp<List<MilvusResult<T>>> query(String... outputFields) throws MilvusException {
|
public MilvusResp<List<MilvusResult<T>>> query(String... outputFields) throws MilvusException {
|
||||||
this.outputFields = Arrays.stream(outputFields).collect(Collectors.toList());
|
this.outputFields = Arrays.stream(outputFields).collect(Collectors.toList());
|
||||||
return query();
|
return query();
|
||||||
|
|||||||
@ -9,4 +9,5 @@ public class MilvusResult<T> {
|
|||||||
private T entity;
|
private T entity;
|
||||||
private Float distance;
|
private Float distance;
|
||||||
private Object id;
|
private Object id;
|
||||||
|
private Long total;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,7 +30,7 @@
|
|||||||
</developer>
|
</developer>
|
||||||
</developers>
|
</developers>
|
||||||
<properties>
|
<properties>
|
||||||
<revision>2.1.4</revision>
|
<revision>2.1.5</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>
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
package org.dromara.milvus.demo;
|
package org.dromara.milvus.demo;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import io.milvus.v2.service.vector.request.data.FloatVec;
|
|
||||||
import io.milvus.v2.service.vector.request.ranker.RRFRanker;
|
import io.milvus.v2.service.vector.request.ranker.RRFRanker;
|
||||||
|
import io.milvus.v2.service.vector.response.DeleteResp;
|
||||||
import io.milvus.v2.service.vector.response.InsertResp;
|
import io.milvus.v2.service.vector.response.InsertResp;
|
||||||
|
import io.milvus.v2.service.vector.response.UpsertResp;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.milvus.demo.model.Face;
|
import org.dromara.milvus.demo.model.Face;
|
||||||
import org.dromara.milvus.demo.model.FaceMilvusMapper;
|
import org.dromara.milvus.demo.model.FaceMilvusMapper;
|
||||||
@ -12,6 +12,9 @@ import org.dromara.milvus.demo.model.Person;
|
|||||||
import org.dromara.milvus.plus.core.conditions.LambdaQueryWrapper;
|
import org.dromara.milvus.plus.core.conditions.LambdaQueryWrapper;
|
||||||
import org.dromara.milvus.plus.model.vo.MilvusResp;
|
import org.dromara.milvus.plus.model.vo.MilvusResp;
|
||||||
import org.dromara.milvus.plus.model.vo.MilvusResult;
|
import org.dromara.milvus.plus.model.vo.MilvusResult;
|
||||||
|
import org.dromara.milvus.plus.service.MilvusService;
|
||||||
|
import org.dromara.milvus.plus.util.GsonUtil;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.ApplicationArguments;
|
import org.springframework.boot.ApplicationArguments;
|
||||||
import org.springframework.boot.ApplicationRunner;
|
import org.springframework.boot.ApplicationRunner;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@ -25,20 +28,45 @@ import java.util.stream.LongStream;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class ApplicationRunnerTest implements ApplicationRunner {
|
public class ApplicationRunnerTest implements ApplicationRunner {
|
||||||
private final FaceMilvusMapper mapper;
|
private final FaceMilvusMapper mapper;
|
||||||
|
@Autowired
|
||||||
|
private MilvusService milvusService;
|
||||||
|
|
||||||
public ApplicationRunnerTest(FaceMilvusMapper mapper) {
|
public ApplicationRunnerTest(FaceMilvusMapper mapper) {
|
||||||
this.mapper = mapper;
|
this.mapper = mapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run(ApplicationArguments args) {
|
public void run(ApplicationArguments args) throws InterruptedException {
|
||||||
insertFace();
|
// insertFace();
|
||||||
|
// selectFace(12);
|
||||||
|
// selectFace(11);
|
||||||
|
// delFace(11);
|
||||||
|
// Thread.sleep(10000);
|
||||||
|
countFace(22);
|
||||||
// getByIdTest();
|
// getByIdTest();
|
||||||
vectorQuery();
|
// vectorQuery();
|
||||||
// scalarQuery();
|
// scalarQuery();
|
||||||
// update();
|
// update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void selectFace(Integer temp){
|
||||||
|
MilvusResp<List<MilvusResult<Face>>> query = mapper.
|
||||||
|
queryWrapper()
|
||||||
|
.eq(Face::getTemp, temp)
|
||||||
|
.query(Face::getPersonName,Face::getTemp);
|
||||||
|
log.info("query temp 11--{}", GsonUtil.toJson(query));
|
||||||
|
}
|
||||||
|
private void countFace(Integer temp){
|
||||||
|
MilvusResp<Long> query = mapper.
|
||||||
|
queryWrapper()
|
||||||
|
.eq(Face::getTemp, temp)
|
||||||
|
.count();
|
||||||
|
log.info("query temp 11--{}", GsonUtil.toJson(query));
|
||||||
|
}
|
||||||
|
private void delFace(Integer temp){
|
||||||
|
MilvusResp<DeleteResp> remove = mapper.deleteWrapper().eq(Face::getTemp, temp).remove();
|
||||||
|
log.info("del temp 11 --{}", GsonUtil.toJson(remove));
|
||||||
|
}
|
||||||
private void insertFace() {
|
private void insertFace() {
|
||||||
List<Face> faces = LongStream.range(1, 10)
|
List<Face> faces = LongStream.range(1, 10)
|
||||||
.mapToObj(i -> {
|
.mapToObj(i -> {
|
||||||
@ -54,20 +82,24 @@ public class ApplicationRunnerTest implements ApplicationRunner {
|
|||||||
person.setAge((int) (i*100));
|
person.setAge((int) (i*100));
|
||||||
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);
|
||||||
return faceTmp;
|
return faceTmp;
|
||||||
})
|
})
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
//新增
|
MilvusResp<InsertResp> insert = milvusService.insert(faces);
|
||||||
MilvusResp<InsertResp> insert = mapper.insertWrapper()
|
|
||||||
.partition("face_001")
|
// //新增
|
||||||
.insert(faces.iterator());
|
// MilvusResp<InsertResp> insert = mapper.insertWrapper()
|
||||||
log.info("insert--{}", JSONObject.toJSONString(insert));
|
// .partition("face_001")
|
||||||
|
// .insert(faces.iterator());
|
||||||
|
log.info("insert--{}", GsonUtil.toJson(insert));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void getByIdTest() {
|
public void getByIdTest() {
|
||||||
//id查询
|
//id查询
|
||||||
MilvusResp<List<MilvusResult<Face>>> query = mapper.getById(9L);
|
// MilvusResp<List<MilvusResult<Face>>> query = mapper.getById(9L);
|
||||||
log.info("query--getById---{}", JSONObject.toJSONString(query));
|
MilvusResp<List<MilvusResult<Face>>> query = milvusService.getById(Face.class, 9L);
|
||||||
|
log.info("query--getById---{}", GsonUtil.toJson(query));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void vectorQuery() {
|
public void vectorQuery() {
|
||||||
@ -83,16 +115,15 @@ public class ApplicationRunnerTest implements ApplicationRunner {
|
|||||||
// .like(Face::getPersonName, "张三")
|
// .like(Face::getPersonName, "张三")
|
||||||
// .topK(3)
|
// .topK(3)
|
||||||
// .query();
|
// .query();
|
||||||
// log.info("向量查询 query--queryWrapper---{}", JSONObject.toJSONString(query1));
|
// log.info("向量查询 query--queryWrapper---{}", GsonUtil.toJson(query1));
|
||||||
|
|
||||||
MilvusResp<List<MilvusResult<Face>>> query = mapper.queryWrapper().
|
MilvusResp<List<MilvusResult<Face>>> query = mapper.queryWrapper().
|
||||||
hybrid(new LambdaQueryWrapper<Face>().vector(Face::getFaceVector, new FloatVec(vector)).topK(2)).
|
hybrid(new LambdaQueryWrapper<Face>().vector(Face::getFaceVector, vector).like(Face::getPersonName, "张三").topK(2)).
|
||||||
hybrid(new LambdaQueryWrapper<Face>().vector(Face::getFaceVector, new FloatVec(vector1)).topK(4)).
|
hybrid(new LambdaQueryWrapper<Face>().vector(Face::getFaceVector, vector1).topK(4)).
|
||||||
ranker(new RRFRanker(20)).
|
ranker(new RRFRanker(20)).
|
||||||
topK(2).
|
topK(2).
|
||||||
query();
|
query();
|
||||||
log.info("向量混合查询 query--queryWrapper---{}", JSONObject.toJSONString(query));
|
log.info("向量混合查询 query--queryWrapper---{}", GsonUtil.toJson(query));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void scalarQuery() {
|
public void scalarQuery() {
|
||||||
@ -102,16 +133,17 @@ public class ApplicationRunnerTest implements ApplicationRunner {
|
|||||||
.jsonContains("person_info[\"images\"]","https://baidu.com")
|
.jsonContains("person_info[\"images\"]","https://baidu.com")
|
||||||
.limit(3L)
|
.limit(3L)
|
||||||
.query();
|
.query();
|
||||||
log.info("标量查询 query--queryWrapper---{}", JSONObject.toJSONString(query2));
|
log.info("标量查询 query--queryWrapper---{}", GsonUtil.toJson(query2));
|
||||||
}
|
}
|
||||||
// public void update(){
|
public void update(){
|
||||||
// Face faceTmp = new Face();
|
Face faceTmp = new Face();
|
||||||
// List<Float> vectorTmp = IntStream.range(0, 128)
|
List<Float> vectorTmp = IntStream.range(0, 128)
|
||||||
// .mapToObj(j -> (float) (Math.random() * 100))
|
.mapToObj(j -> (float) (Math.random() * 100))
|
||||||
// .collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
// faceTmp.setFaceVector(vectorTmp);
|
faceTmp.setFaceVector(vectorTmp);
|
||||||
// faceTmp.setPersonName("赵六");
|
faceTmp.setPersonName("赵六");
|
||||||
|
MilvusResp<UpsertResp> resp = milvusService.updateById(faceTmp);
|
||||||
// MilvusResp<UpsertResp> resp = mapper.updateWrapper().eq(FaceConstants.PERSON_NAME,"张三").update(faceTmp);
|
// MilvusResp<UpsertResp> resp = mapper.updateWrapper().eq(FaceConstants.PERSON_NAME,"张三").update(faceTmp);
|
||||||
// System.out.printf("===="+ JSON.toJSONString(resp));
|
System.out.printf("===="+ GsonUtil.toJson(resp));
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user