diff --git a/milvus-plus-core/pom.xml b/milvus-plus-core/pom.xml index 97c6433..d1e01d8 100644 --- a/milvus-plus-core/pom.xml +++ b/milvus-plus-core/pom.xml @@ -28,7 +28,7 @@ io.milvus milvus-sdk-java - 2.4.0 + 2.4.2 org.apache.logging.log4j @@ -58,6 +58,12 @@ ${mica-auto.vaersion} provided + + com.alibaba + fastjson + 2.0.47 + compile + diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/annotation/MilvusCollection.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/annotation/MilvusCollection.java index cc36d13..f5d1d01 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/annotation/MilvusCollection.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/annotation/MilvusCollection.java @@ -1,5 +1,8 @@ package org.dromara.milvus.plus.annotation; + +import io.milvus.v2.common.ConsistencyLevel; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -20,4 +23,6 @@ public @interface MilvusCollection { * */ String[] alias() default {}; + + ConsistencyLevel level() default ConsistencyLevel.BOUNDED; } \ No newline at end of file diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/builder/CollectionSchemaBuilder.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/builder/CollectionSchemaBuilder.java index 70e98fb..348aea0 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/builder/CollectionSchemaBuilder.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/builder/CollectionSchemaBuilder.java @@ -2,6 +2,7 @@ package org.dromara.milvus.plus.builder; import io.milvus.exception.MilvusException; import io.milvus.v2.client.MilvusClientV2; +import io.milvus.v2.common.ConsistencyLevel; import io.milvus.v2.common.IndexParam; import io.milvus.v2.service.collection.request.AddFieldReq; import io.milvus.v2.service.collection.request.CreateCollectionReq; @@ -14,6 +15,7 @@ public class CollectionSchemaBuilder { private final String collectionName; private final MilvusClientV2 wrapper; private final CreateCollectionReq.CollectionSchema schema; + private ConsistencyLevel consistencyLevel=ConsistencyLevel.BOUNDED; public CollectionSchemaBuilder(String collectionName, MilvusClientV2 wrapper) { this.collectionName = collectionName; @@ -31,11 +33,19 @@ public class CollectionSchemaBuilder { } return this; } + public void addConsistencyLevel(ConsistencyLevel level){ + this.consistencyLevel=level; + } + public CreateCollectionReq.FieldSchema getField(String fileName){ return schema.getField(fileName); } public void createSchema() throws MilvusException { - CreateCollectionReq req=CreateCollectionReq.builder().collectionName(this.collectionName).collectionSchema(this.schema).build(); + CreateCollectionReq req=CreateCollectionReq.builder(). + collectionName(this.collectionName). + collectionSchema(this.schema). + consistencyLevel(this.consistencyLevel) + .build(); wrapper.createCollection(req); } public void createIndex(java.util.List indexParams) throws MilvusException { diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/MilvusConverter.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/MilvusConverter.java index 0e4780e..5566efb 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/MilvusConverter.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/MilvusConverter.java @@ -3,6 +3,7 @@ package org.dromara.milvus.plus.converter; import com.google.common.collect.Lists; import io.milvus.v2.client.MilvusClientV2; +import io.milvus.v2.common.ConsistencyLevel; import io.milvus.v2.common.IndexParam; import io.milvus.v2.service.collection.request.AddFieldReq; import io.milvus.v2.service.collection.request.GetLoadStateReq; @@ -22,6 +23,8 @@ import org.dromara.milvus.plus.model.MilvusEntity; import org.springframework.util.CollectionUtils; import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -66,6 +69,9 @@ public class MilvusConverter { // 集合名称 String collectionName = collectionAnnotation.name(); milvus.setCollectionName(collectionName); + //一致性级别 + ConsistencyLevel level = collectionAnnotation.level(); + milvus.setConsistencyLevel(level); // 集合别名 if (collectionAnnotation.alias().length > 0) { milvus.setAlias(Arrays.asList(collectionAnnotation.alias())); @@ -105,7 +111,13 @@ public class MilvusConverter { .filter(StringUtils::isNotEmpty).ifPresent(builder::description); // 处理向量字段的维度 Optional.of(fieldAnnotation.dimension()) - .filter(dimension -> dimension > 0).ifPresent(builder::dimension); + .filter(dimension -> dimension > 0).ifPresent( + dimension -> { + builder.dimension(dimension); + if (!isListFloat(field)) { + throw new IllegalArgumentException("Vector field type mismatch"); + } + } ); // 数组字段的最大长度 Optional.of(fieldAnnotation.maxLength()) .filter(maxLength -> maxLength > 0).ifPresent(builder::maxLength); @@ -120,7 +132,6 @@ public class MilvusConverter { // 设置Milvus字段和索引参数 milvus.setMilvusFields(milvusFields); milvus.setIndexParams(indexParams); - // 缓存转换结果和集合信息 ConversionCache conversionCache = new ConversionCache(); conversionCache.setMilvusEntity(milvus); @@ -212,6 +223,7 @@ public class MilvusConverter { milvusEntity.getCollectionName(), client ); schemaBuilder.addField(milvusEntity.getMilvusFields().toArray(new AddFieldReq[0])); + schemaBuilder.addConsistencyLevel(milvusEntity.getConsistencyLevel()); log.info("-------create schema---------"); schemaBuilder.createSchema(); schemaBuilder.createIndex(indexParams); @@ -274,4 +286,36 @@ public class MilvusConverter { client.loadPartitions(loadPartitionsReq); log.info("load partition--{}", milvusEntity.getPartitionName()); } + /** + * 判断字段是否是 List 类型。 + * + * @param field 要检查的字段 + * @return 如果字段是 List 类型返回 true,否则返回 false + */ + public static boolean isListFloat(Field field) { + // 确保字段不是 null + if (field == null) { + return false; + } + // 获取字段的泛型类型 + Type genericType = field.getGenericType(); + + // 检查是否是参数化类型 + if (!(genericType instanceof ParameterizedType)) { + return false; + } + // 类型转换 + ParameterizedType parameterizedType = (ParameterizedType) genericType; + // 获取参数化类型的原始类型 + Type rawType = parameterizedType.getRawType(); + + // 检查原始类型是否是 List.class + if (!(rawType instanceof Class) || !List.class.isAssignableFrom((Class) rawType)) { + return false; + } + // 获取类型参数 + Type[] typeArguments = parameterizedType.getActualTypeArguments(); + // 检查类型参数是否正好有一个,并且是 Float.TYPE + return typeArguments.length == 1 && typeArguments[0] == Float.class; + } } diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/SearchRespConverter.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/SearchRespConverter.java index d414b39..6c7fe83 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/SearchRespConverter.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/SearchRespConverter.java @@ -1,6 +1,8 @@ package org.dromara.milvus.plus.converter; +import com.alibaba.fastjson2.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.JsonObject; import io.milvus.v2.service.vector.response.GetResp; import io.milvus.v2.service.vector.response.QueryResp; import io.milvus.v2.service.vector.response.SearchResp; @@ -42,14 +44,19 @@ public class SearchRespConverter { Map entityMap = new HashMap<>(); for (Map.Entry entry : searchResult.getEntity().entrySet()) { String key = propertyCache.findKeyByValue(entry.getKey()); - entityMap.put(key, entry.getValue()); + Object value = entry.getValue(); + if (value instanceof JsonObject) { + JSONObject v = JSONObject.parseObject(value.toString()); + entityMap.put(key,v); + } else { + entityMap.put(key,value); + } } // 将转换后的Map转换为Java实体类T T entity = objectMapper.convertValue(entityMap, entityType); - MilvusResult tMilvusResult = new MilvusResult<>(); tMilvusResult.setId(searchResult.getId()); - tMilvusResult.setDistance(searchResult.getDistance()); + tMilvusResult.setDistance(searchResult.getScore()); tMilvusResult.setEntity(entity); return tMilvusResult; }) @@ -107,7 +114,13 @@ public class SearchRespConverter { // 通过属性缓存转换键名,以适应Java实体的字段命名 for (Map.Entry entry : entityMap.entrySet()) { String key = propertyCache.findKeyByValue(entry.getKey()); - entityMap2.put(key,entry.getValue()); + Object value = entry.getValue(); + if (value instanceof JsonObject) { + JSONObject v = JSONObject.parseObject(value.toString()); + entityMap2.put(key,v); + } else { + entityMap2.put(key,value); + } } // 使用转换工具将映射后的Map转换为指定类型的实体 T entity = objectMapper.convertValue(entityMap2, entityType); diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/ConditionBuilder.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/ConditionBuilder.java index 9fe5210..a2a6629 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/ConditionBuilder.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/ConditionBuilder.java @@ -203,8 +203,6 @@ public abstract class ConditionBuilder { return this; } - - public ConditionBuilder eq(FieldFunction fieldName, Object value) { return addFilter(fieldName, "==", value); } diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/LambdaInsertWrapper.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/LambdaInsertWrapper.java index 35ca80f..ad2a4f7 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/LambdaInsertWrapper.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/LambdaInsertWrapper.java @@ -2,6 +2,8 @@ package org.dromara.milvus.plus.core.conditions; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import io.milvus.exception.MilvusException; import io.milvus.v2.client.MilvusClientV2; import io.milvus.v2.service.vector.request.InsertReq; @@ -9,7 +11,6 @@ import io.milvus.v2.service.vector.response.InsertResp; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ClassUtils; import org.apache.commons.lang3.StringUtils; import org.dromara.milvus.plus.cache.CollectionToPrimaryCache; import org.dromara.milvus.plus.cache.ConversionCache; @@ -20,6 +21,7 @@ import org.dromara.milvus.plus.model.vo.MilvusResp; import org.dromara.milvus.plus.util.IdWorkerUtils; import java.util.*; +import java.util.stream.Collectors; /** * 构建器内部类,用于构建insert请求 @@ -74,10 +76,12 @@ public class LambdaInsertWrapper extends AbstractChainWrapper implements private MilvusResp insert(List jsonObjects){ - log.info("insert data--->{}", JSON.toJSONString(jsonObjects)); + JsonParser jsonParser = new JsonParser(); + log.info("update data--->{}", JSON.toJSONString(jsonObjects)); + List objects = jsonObjects.stream().map(v -> jsonParser.parse(v.toJSONString()).getAsJsonObject()).collect(Collectors.toList()); InsertReq.InsertReqBuilder builder = InsertReq.builder() .collectionName(collectionName) - .data(jsonObjects); + .data(objects); if(StringUtils.isNotEmpty(partitionName)){ builder.partitionName(partitionName); } @@ -105,11 +109,6 @@ public class LambdaInsertWrapper extends AbstractChainWrapper implements for (Map.Entry entry : propertiesMap.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); - if (!ClassUtils.isPrimitiveOrWrapper(value.getClass()) && !(value instanceof String)&& !(value instanceof Collection)) { - //对象类型转成JSONObject - String jv = JSONObject.toJSONString(value); - value = JSONObject.parseObject(jv); - } String tk = propertyCache.functionToPropertyMap.get(key); jsonObject.put(tk,value); } diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/LambdaQueryWrapper.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/LambdaQueryWrapper.java index 7db0a8f..abc5ba5 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/LambdaQueryWrapper.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/LambdaQueryWrapper.java @@ -1,12 +1,14 @@ package org.dromara.milvus.plus.core.conditions; -import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSON; import io.milvus.exception.MilvusException; import io.milvus.v2.client.MilvusClientV2; import io.milvus.v2.common.ConsistencyLevel; import io.milvus.v2.service.vector.request.GetReq; import io.milvus.v2.service.vector.request.QueryReq; import io.milvus.v2.service.vector.request.SearchReq; +import io.milvus.v2.service.vector.request.data.BaseVector; +import io.milvus.v2.service.vector.request.data.FloatVec; import io.milvus.v2.service.vector.response.GetResp; import io.milvus.v2.service.vector.response.QueryResp; import io.milvus.v2.service.vector.response.SearchResp; @@ -15,6 +17,8 @@ import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.dromara.milvus.plus.cache.ConversionCache; +import org.dromara.milvus.plus.cache.MilvusCache; +import org.dromara.milvus.plus.converter.MilvusConverter; import org.dromara.milvus.plus.converter.SearchRespConverter; import org.dromara.milvus.plus.core.FieldFunction; import org.dromara.milvus.plus.model.vo.MilvusResp; @@ -41,7 +45,7 @@ public class LambdaQueryWrapper extends AbstractChainWrapper implements Wr private String annsField; private int topK; - private List> vectors = new ArrayList<>(); + private List vectors = new ArrayList<>(); private long offset; private long limit; private int roundDecimal = -1; @@ -77,6 +81,10 @@ public class LambdaQueryWrapper extends AbstractChainWrapper implements Wr this.partitionNames.addAll(Arrays.asList(partitionName)); return this; } + public LambdaQueryWrapper consistencyLevel(ConsistencyLevel level){ + this.consistencyLevel=level; + return this; + } public LambdaQueryWrapper partition(FieldFunction... partitionName) { Iterator> iterator = new ArrayIterator<>(partitionName); @@ -402,16 +410,34 @@ public class LambdaQueryWrapper extends AbstractChainWrapper implements Wr this.annsField=annsField.getFieldName(annsField); return this; } - public LambdaQueryWrapper vector(List vector) { + public LambdaQueryWrapper vector(List vector) { + BaseVector baseVector = new FloatVec((List) vector); + vectors.add(baseVector); + return this; + } + public LambdaQueryWrapper vector(String annsField, List vector) { + this.annsField=annsField; + BaseVector baseVector = new FloatVec((List) vector); + vectors.add(baseVector); + return this; + } + public LambdaQueryWrapper vector(FieldFunction annsField, List vector) { + this.annsField=annsField.getFieldName(annsField); + BaseVector baseVector = new FloatVec((List) vector); + vectors.add(baseVector); + return this; + } + + public LambdaQueryWrapper vector(BaseVector vector) { vectors.add(vector); return this; } - public LambdaQueryWrapper vector(String annsField, List vector) { + public LambdaQueryWrapper vector(String annsField,BaseVector vector) { this.annsField=annsField; vectors.add(vector); return this; } - public LambdaQueryWrapper vector(FieldFunction annsField, List vector) { + public LambdaQueryWrapper vector(FieldFunction annsField, BaseVector vector) { this.annsField=annsField.getFieldName(annsField); vectors.add(vector); return this; @@ -431,10 +457,12 @@ public class LambdaQueryWrapper extends AbstractChainWrapper implements Wr private SearchReq buildSearch() { SearchReq.SearchReqBuilder builder = SearchReq.builder() .collectionName(StringUtils.isNotBlank(collectionAlias) ? collectionAlias : collectionName); - if (annsField != null && !annsField.isEmpty()) { builder.annsField(annsField); } + if(consistencyLevel!=null){ + builder.consistencyLevel(consistencyLevel); + } if (!vectors.isEmpty()) { builder.data(vectors); } @@ -497,19 +525,56 @@ public class LambdaQueryWrapper extends AbstractChainWrapper implements Wr * * @return 搜索响应对象 */ - public MilvusResp>> query() throws MilvusException { - if (!vectors.isEmpty()) { - SearchReq searchReq = buildSearch(); - log.info("build search param-->{}", JSON.toJSONString(searchReq)); - SearchResp search = client.search(searchReq); - return SearchRespConverter.convertSearchRespToMilvusResp(search, entityType); - } else { - QueryReq queryReq = buildQuery(); - log.info("build query param-->{}", JSON.toJSONString(queryReq)); - QueryResp query = client.query(queryReq); - return SearchRespConverter.convertGetRespToMilvusResp(query, entityType); +// public MilvusResp>> query() throws MilvusException { +// if (!vectors.isEmpty()) { +// SearchReq searchReq = buildSearch(); +// log.info("build search param-->{}", JSON.toJSONString(searchReq)); +// SearchResp search = client.search(searchReq); +// return SearchRespConverter.convertSearchRespToMilvusResp(search, entityType); +// } else { +// QueryReq queryReq = buildQuery(); +// log.info("build query param-->{}", JSON.toJSONString(queryReq)); +// QueryResp query = client.query(queryReq); +// return SearchRespConverter.convertGetRespToMilvusResp(query, entityType); +// } +// } + public MilvusResp>> query() throws MilvusException{ + return query(1); + } + private MilvusResp>> query(int attempt) throws MilvusException{ + try { + return executeQuery(attempt); + } catch (Exception e) { + if (e.getMessage() != null && e.getMessage().contains("collection not loaded") && attempt < maxRetries) { + log.warn("Attempt {}: Collection not loaded, attempting to reload and retry.", attempt); + handleCollectionNotLoaded(); + return query(attempt + 1); + } else { + throw new RuntimeException(e); + } } } + private MilvusResp>> executeQuery(int attempt) throws Exception { + if (!vectors.isEmpty()) { + SearchReq searchReq = buildSearch(); + log.info("Attempt {}: Build search param--> {}", attempt, JSON.toJSONString(searchReq)); + SearchResp searchResp = client.search(searchReq); + return SearchRespConverter.convertSearchRespToMilvusResp(searchResp, entityType); + } else { + QueryReq queryReq = buildQuery(); + log.info("Attempt {}: Build query param--> {}", attempt, JSON.toJSONString(queryReq)); + QueryResp queryResp = client.query(queryReq); + return SearchRespConverter.convertGetRespToMilvusResp(queryResp, entityType); + } + } + + private void handleCollectionNotLoaded() { + ConversionCache cache = MilvusCache.milvusCache.get(entityType.getName()); + MilvusConverter.loadStatus(cache.getMilvusEntity(), client); + } + + // 定义最大重试次数的常量 + private static final int maxRetries = 2; public MilvusResp>> query(FieldFunction... outputFields) throws MilvusException { List otf = new ArrayList<>(); diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/LambdaUpdateWrapper.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/LambdaUpdateWrapper.java index 94501b3..04eb83b 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/LambdaUpdateWrapper.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/core/conditions/LambdaUpdateWrapper.java @@ -2,6 +2,8 @@ package org.dromara.milvus.plus.core.conditions; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import io.milvus.exception.MilvusException; import io.milvus.v2.client.MilvusClientV2; import io.milvus.v2.service.vector.request.QueryReq; @@ -22,6 +24,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 构建器内部类,用于构建update请求 @@ -427,10 +430,12 @@ public class LambdaUpdateWrapper extends AbstractChainWrapper implements W } private MilvusResp update(List jsonObjects) { + JsonParser jsonParser = new JsonParser(); log.info("update data--->{}", JSON.toJSONString(jsonObjects)); + List objects = jsonObjects.stream().map(v -> jsonParser.parse(v.toJSONString()).getAsJsonObject()).collect(Collectors.toList()); UpsertReq.UpsertReqBuilder builder = UpsertReq.builder() .collectionName(collectionName) - .data(jsonObjects); + .data(objects); if (StringUtils.isNotEmpty(partitionName)) { builder.partitionName(partitionName); } diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/model/MilvusEntity.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/model/MilvusEntity.java index 78c5919..0011fd4 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/model/MilvusEntity.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/model/MilvusEntity.java @@ -1,5 +1,6 @@ package org.dromara.milvus.plus.model; +import io.milvus.v2.common.ConsistencyLevel; import io.milvus.v2.common.IndexParam; import io.milvus.v2.service.collection.request.AddFieldReq; import lombok.Data; @@ -16,5 +17,5 @@ public class MilvusEntity { private List indexParams; private List milvusFields; private List partitionName; - + private ConsistencyLevel consistencyLevel; } diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/IVecMService.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/IVecMService.java index 30c2520..a113413 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/IVecMService.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/IVecMService.java @@ -1,10 +1,11 @@ package org.dromara.milvus.plus.service; -import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonObject; import io.milvus.exception.MilvusException; import io.milvus.v2.client.MilvusClientV2; import io.milvus.v2.common.ConsistencyLevel; import io.milvus.v2.service.vector.request.*; +import io.milvus.v2.service.vector.request.data.BaseVector; import io.milvus.v2.service.vector.response.*; import java.util.Collections; @@ -110,7 +111,7 @@ public interface IVecMService { */ default InsertResp insert( String collectionName, - List data, + List data, String partitionName ) throws MilvusException { MilvusClientV2 client = getClient(); @@ -129,7 +130,7 @@ public interface IVecMService { * @return InsertResp对象,包含插入实体的数量信息 * @throws MilvusException 如果操作过程中发生错误 */ - default InsertResp insert(String collectionName, JSONObject data) throws MilvusException { + default InsertResp insert(String collectionName, JsonObject data) throws MilvusException { return insert(collectionName, Collections.singletonList(data), null); } @@ -219,7 +220,7 @@ public interface IVecMService { int topK, String filter, List outputFields, - List data, + List data, long offset, long limit, int roundDecimal, @@ -258,7 +259,7 @@ public interface IVecMService { * @return 搜索结果对象列表 * @throws MilvusException 如果操作过程中发生错误 */ - default SearchResp search(String collectionName, List data, int topK) throws MilvusException { + default SearchResp search(String collectionName, List data, int topK) throws MilvusException { return search(collectionName, Collections.emptyList(), null, topK, "", Collections.emptyList(), data, 0, 0, -1, Collections.emptyMap(), 0, 0, ConsistencyLevel.BOUNDED, false); } @@ -273,7 +274,7 @@ public interface IVecMService { default UpsertResp upsert( String collectionName, String partitionName, - List data) throws MilvusException { + List data) throws MilvusException { MilvusClientV2 client = getClient(); UpsertReq upsertReq = UpsertReq.builder() .collectionName(collectionName) @@ -290,7 +291,7 @@ public interface IVecMService { * @return UpsertResp对象,包含插入或更新实体的数量信息 * @throws MilvusException 如果操作过程中发生错误 */ - default UpsertResp upsert(String collectionName, JSONObject data) throws MilvusException { + default UpsertResp upsert(String collectionName, JsonObject data) throws MilvusException { return upsert(collectionName, null, Collections.singletonList(data)); } diff --git a/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java b/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java index 4489255..72afb81 100644 --- a/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java +++ b/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java @@ -1,5 +1,6 @@ package org.dromara.milvus.demo.model; +import io.milvus.v2.common.ConsistencyLevel; import io.milvus.v2.common.DataType; import io.milvus.v2.common.IndexParam; import lombok.Data; @@ -8,7 +9,7 @@ import org.dromara.milvus.plus.annotation.*; import java.util.List; @Data -@MilvusCollection(name = "face_collection") +@MilvusCollection(name = "face_collection",level = ConsistencyLevel.STRONG) @MilvusPartition(name = {"face_001", "face_002"}) @GenerateMilvusMapper public class Face {