瀏覽代碼

fix several bugs and add new parameter to support partition key. (#792)

* bug fix: check the fieldName and indexName matches the describeIndex request

Signed-off-by: Nian Liu <nian.liu@zilliz.com>

* add partitionKey support for collection create, add ShardsNum, Array, etc.

Signed-off-by: Nian Liu <nian.liu@zilliz.com>

* Feature sync: update createCollection to add several new params; add AddFieldReq, update QueryResp and SearchResp

Signed-off-by: Nian Liu <nian.liu@zilliz.com>

---------

Signed-off-by: Nian Liu <nian.liu@zilliz.com>
Nian Liu 1 年之前
父節點
當前提交
af626565f3
共有 21 個文件被更改,包括 176 次插入125 次删除
  1. 2 0
      .gitignore
  2. 2 4
      src/main/java/io/milvus/v2/client/MilvusClientV2.java
  3. 4 4
      src/main/java/io/milvus/v2/examples/Simple.java
  4. 17 12
      src/main/java/io/milvus/v2/examples/Simple_Schema.java
  5. 2 1
      src/main/java/io/milvus/v2/exception/ErrorCode.java
  6. 16 8
      src/main/java/io/milvus/v2/service/collection/CollectionService.java
  7. 26 0
      src/main/java/io/milvus/v2/service/collection/request/AddFieldReq.java
  8. 41 57
      src/main/java/io/milvus/v2/service/collection/request/CreateCollectionReq.java
  9. 1 1
      src/main/java/io/milvus/v2/service/collection/request/LoadCollectionReq.java
  10. 15 2
      src/main/java/io/milvus/v2/service/index/IndexService.java
  11. 1 0
      src/main/java/io/milvus/v2/service/index/request/ListIndexesReq.java
  12. 21 7
      src/main/java/io/milvus/v2/service/vector/VectorService.java
  13. 1 0
      src/main/java/io/milvus/v2/service/vector/request/GetReq.java
  14. 3 1
      src/main/java/io/milvus/v2/service/vector/request/QueryReq.java
  15. 2 9
      src/main/java/io/milvus/v2/service/vector/request/SearchReq.java
  16. 1 1
      src/main/java/io/milvus/v2/service/vector/response/QueryResp.java
  17. 3 2
      src/main/java/io/milvus/v2/service/vector/response/SearchResp.java
  18. 9 8
      src/main/java/io/milvus/v2/utils/ConvertUtils.java
  19. 5 2
      src/main/java/io/milvus/v2/utils/SchemaUtils.java
  20. 2 1
      src/main/java/io/milvus/v2/utils/VectorUtils.java
  21. 2 5
      src/test/java/io/milvus/v2/service/collection/CollectionTest.java

+ 2 - 0
.gitignore

@@ -34,3 +34,5 @@ volumes/
 examples/main/java/io/milvus/tls/*
 !examples/main/java/io/milvus/tls/gen.sh
 !examples/main/java/io/milvus/tls/openssl.cnf
+/src/main/java/io/milvus/v2/examples/*
+/src/main/java/io/milvus/v2/examples/ManageCollectionDemo.java

+ 2 - 4
src/main/java/io/milvus/v2/client/MilvusClientV2.java

@@ -117,12 +117,10 @@ public class MilvusClientV2 {
 
     /**
      * Creates a collection schema.
-     * @param enableDynamicField enable dynamic field
-     * @param description collection description
      * @return CreateCollectionReq.CollectionSchema
      */
-    public CreateCollectionReq.CollectionSchema createSchema(Boolean enableDynamicField, String description) {
-        return collectionService.createSchema(enableDynamicField, description);
+    public CreateCollectionReq.CollectionSchema createSchema() {
+        return collectionService.createSchema();
     }
 
     /**

+ 4 - 4
src/main/java/io/milvus/v2/examples/Simple.java

@@ -20,7 +20,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Random;
-import java.util.concurrent.TimeUnit;
 
 public class Simple {
     Integer dim = 2;
@@ -36,19 +35,20 @@ public class Simple {
 
     public void run() throws InterruptedException {
         ConnectConfig connectConfig = ConnectConfig.builder()
-                .uri("https://in01-******.aws-us-west-2.vectordb.zillizcloud.com:19531")
-                .token("*****")
+                .uri("https://in01-***.aws-us-west-2.vectordb.zillizcloud.com:19531")
+                .token("***")
                 .build();
         MilvusClientV2 client = new MilvusClientV2(connectConfig);
         // check collection exists
         if (client.hasCollection(HasCollectionReq.builder().collectionName(collectionName).build())) {
             logger.info("collection exists");
             client.dropCollection(DropCollectionReq.builder().collectionName(collectionName).build());
-            TimeUnit.SECONDS.sleep(1);
+            logger.info("collection dropped");
         }
         // create collection
         CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()
                 .collectionName(collectionName)
+                .description("simple collection")
                 .dimension(dim)
                 .build();
         client.createCollection(createCollectionReq);

+ 17 - 12
src/main/java/io/milvus/v2/examples/Simple_Schema.java

@@ -5,10 +5,7 @@ import io.milvus.v2.client.ConnectConfig;
 import io.milvus.v2.client.MilvusClientV2;
 import io.milvus.v2.common.DataType;
 import io.milvus.v2.common.IndexParam;
-import io.milvus.v2.service.collection.request.CreateCollectionReq;
-import io.milvus.v2.service.collection.request.DropCollectionReq;
-import io.milvus.v2.service.collection.request.HasCollectionReq;
-import io.milvus.v2.service.collection.request.LoadCollectionReq;
+import io.milvus.v2.service.collection.request.*;
 import io.milvus.v2.service.index.request.CreateIndexReq;
 import io.milvus.v2.service.vector.request.InsertReq;
 import io.milvus.v2.service.vector.request.QueryReq;
@@ -30,25 +27,27 @@ public class Simple_Schema {
     static Logger logger = LoggerFactory.getLogger(Simple_Schema.class);
     public void run() throws InterruptedException {
         ConnectConfig connectConfig = ConnectConfig.builder()
-                .uri("https://in01-****.aws-us-west-2.vectordb.zillizcloud.com:19531")
-                .token("******")
+                .uri("https://in01-***.aws-us-west-2.vectordb.zillizcloud.com:19531")
+                .token("***")
                 .build();
         MilvusClientV2 client = new MilvusClientV2(connectConfig);
         // check collection exists
         if (client.hasCollection(HasCollectionReq.builder().collectionName(collectionName).build())) {
             logger.info("collection exists");
             client.dropCollection(DropCollectionReq.builder().collectionName(collectionName).build());
-            TimeUnit.SECONDS.sleep(1);
         }
         // create collection
-        CreateCollectionReq.CollectionSchema collectionSchema = client.createSchema(Boolean.TRUE, "");
-        collectionSchema.addPrimaryField("id", DataType.Int64, Boolean.TRUE, Boolean.FALSE);
-        collectionSchema.addVectorField("vector", DataType.FloatVector, dim);
-        collectionSchema.addScalarField("num", DataType.Int32);
+        CreateCollectionReq.CollectionSchema collectionSchema = client.createSchema();
+        collectionSchema.addField(AddFieldReq.builder().fieldName("id").dataType(DataType.Int64).isPrimaryKey(Boolean.TRUE).autoID(Boolean.FALSE).description("id").build());
+        collectionSchema.addField(AddFieldReq.builder().fieldName("vector").dataType(DataType.FloatVector).dimension(dim).build());
+        collectionSchema.addField(AddFieldReq.builder().fieldName("num").dataType(DataType.Int64).isPartitionKey(Boolean.TRUE).build());
+        collectionSchema.addField(AddFieldReq.builder().fieldName("array").dataType(DataType.Array).elementType(DataType.Int32).maxCapacity(10).description("array").build());
 
         CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()
                 .collectionName(collectionName)
+                .description("simple collection")
                 .collectionSchema(collectionSchema)
+                .enableDynamicField(Boolean.FALSE)
                 .build();
         client.createCollection(createCollectionReq);
         //create index
@@ -61,6 +60,7 @@ public class Simple_Schema {
                 .indexParams(Collections.singletonList(indexParam))
                 .build();
         client.createIndex(createIndexReq);
+        TimeUnit.SECONDS.sleep(1);
         client.loadCollection(LoadCollectionReq.builder().collectionName(collectionName).build());
         //insert data
         List<JSONObject> insertData = new ArrayList<>();
@@ -71,9 +71,12 @@ public class Simple_Schema {
                 // generate random float vector
                 vectorList.add(new Random().nextFloat());
             }
+            List<Integer> array = new ArrayList<>();
+            array.add(i);
             jsonObject.put("id", (long) i);
             jsonObject.put("vector", vectorList);
-            jsonObject.put("num", i);
+            jsonObject.put("num", (long) i);
+            jsonObject.put("array", array);
             insertData.add(jsonObject);
         }
 
@@ -88,11 +91,13 @@ public class Simple_Schema {
                 .filter("id in [0]")
                 .build();
         QueryResp queryResp = client.query(queryReq);
+        queryResp.getQueryResults().get(0).getEntity().get("vector");
         System.out.println(queryResp);
         //search data
         SearchReq searchReq = SearchReq.builder()
                 .collectionName(collectionName)
                 .data(Collections.singletonList(insertData.get(0).get("vector")))
+                .outputFields(Collections.singletonList("vector"))
                 .topK(10)
                 .build();
         SearchResp searchResp = client.search(searchReq);

+ 2 - 1
src/main/java/io/milvus/v2/exception/ErrorCode.java

@@ -6,7 +6,8 @@ import lombok.Getter;
 public enum ErrorCode {
     SUCCESS(0),
     COLLECTION_NOT_FOUND(1),
-    SERVER_ERROR(2);
+    SERVER_ERROR(2),
+    INVALID_PARAMS(3);
 
     private final int code;
 

+ 16 - 8
src/main/java/io/milvus/v2/service/collection/CollectionService.java

@@ -44,6 +44,7 @@ public class CollectionService extends BaseService {
 
         CollectionSchema schema = CollectionSchema.newBuilder()
                 .setName(request.getCollectionName())
+                .setDescription(request.getDescription())
                 .addFields(vectorSchema)
                 .addFields(idSchema)
                 .setEnableDynamicField(request.getEnableDynamicField())
@@ -53,6 +54,7 @@ public class CollectionService extends BaseService {
         CreateCollectionRequest createCollectionRequest = CreateCollectionRequest.newBuilder()
                 .setCollectionName(request.getCollectionName())
                 .setSchema(schema.toByteString())
+                .setShardsNum(request.getNumShards())
                 .build();
 
         Status status = blockingStub.createCollection(createCollectionRequest);
@@ -69,7 +71,12 @@ public class CollectionService extends BaseService {
                         .build();
         indexService.createIndex(blockingStub, createIndexReq);
         //load collection
-        loadCollection(blockingStub, LoadCollectionReq.builder().collectionName(request.getCollectionName()).build());
+        try {
+            //TimeUnit.MILLISECONDS.sleep(1000);
+            loadCollection(blockingStub, LoadCollectionReq.builder().collectionName(request.getCollectionName()).build());
+        } catch (Exception e) {
+            throw new MilvusClientException(ErrorCode.SERVER_ERROR, "Load collection failed" + e.getMessage());
+        }
     }
 
     public void createCollectionWithSchema(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub, CreateCollectionReq request) {
@@ -78,8 +85,8 @@ public class CollectionService extends BaseService {
         //convert CollectionSchema to io.milvus.grpc.CollectionSchema
         CollectionSchema grpcSchema = CollectionSchema.newBuilder()
                 .setName(request.getCollectionName())
-                .setDescription(request.getCollectionSchema().getDescription())
-                .setEnableDynamicField(request.getCollectionSchema().getEnableDynamicField())
+                .setDescription(request.getDescription())
+                .setEnableDynamicField(request.getEnableDynamicField())
                 .build();
         for (CreateCollectionReq.FieldSchema fieldSchema : request.getCollectionSchema().getFieldSchemaList()) {
             grpcSchema = grpcSchema.toBuilder().addFields(SchemaUtils.convertToGrpcFieldSchema(fieldSchema)).build();
@@ -89,8 +96,11 @@ public class CollectionService extends BaseService {
         CreateCollectionRequest createCollectionRequest = CreateCollectionRequest.newBuilder()
                 .setCollectionName(request.getCollectionName())
                 .setSchema(grpcSchema.toByteString())
+                .setShardsNum(request.getNumShards())
                 .build();
-
+        if (request.getNumPartitions() != null) {
+            createCollectionRequest = createCollectionRequest.toBuilder().setNumPartitions(request.getNumPartitions()).build();
+        }
         Status createCollectionResponse = blockingStub.createCollection(createCollectionRequest);
         rpcUtils.handleResponse(title, createCollectionResponse);
 
@@ -181,7 +191,7 @@ public class CollectionService extends BaseService {
         String title = String.format("LoadCollectionRequest collectionName:%s", request.getCollectionName());
         LoadCollectionRequest loadCollectionRequest = LoadCollectionRequest.newBuilder()
                 .setCollectionName(request.getCollectionName())
-                .setReplicaNumber(request.getReplicaNum())
+                .setReplicaNumber(request.getNumReplicas())
                 .build();
         Status status = milvusServiceBlockingStub.loadCollection(loadCollectionRequest);
         rpcUtils.handleResponse(title, status);
@@ -230,10 +240,8 @@ public class CollectionService extends BaseService {
         return getCollectionStatsResp;
     }
 
-    public CreateCollectionReq.CollectionSchema createSchema(Boolean enableDynamicField, String description) {
+    public CreateCollectionReq.CollectionSchema createSchema() {
         return CreateCollectionReq.CollectionSchema.builder()
-                .enableDynamicField(enableDynamicField)
-                .description(description)
                 .build();
     }
 

+ 26 - 0
src/main/java/io/milvus/v2/service/collection/request/AddFieldReq.java

@@ -0,0 +1,26 @@
+package io.milvus.v2.service.collection.request;
+
+import io.milvus.v2.common.DataType;
+import lombok.Builder;
+import lombok.Data;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+public class AddFieldReq {
+    private String fieldName;
+    @Builder.Default
+    private String description = "";
+    private DataType dataType;
+    @Builder.Default
+    private Integer maxLength = 65535;
+    @Builder.Default
+    private Boolean isPrimaryKey = Boolean.FALSE;
+    @Builder.Default
+    private Boolean isPartitionKey = Boolean.FALSE;
+    @Builder.Default
+    private Boolean autoID = Boolean.FALSE;
+    private Integer dimension;
+    private io.milvus.v2.common.DataType elementType;
+    private Integer maxCapacity;
+}

+ 41 - 57
src/main/java/io/milvus/v2/service/collection/request/CreateCollectionReq.java

@@ -2,6 +2,8 @@ package io.milvus.v2.service.collection.request;
 
 import io.milvus.v2.common.DataType;
 import io.milvus.v2.common.IndexParam;
+import io.milvus.v2.exception.ErrorCode;
+import io.milvus.v2.exception.MilvusClientException;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NonNull;
@@ -15,6 +17,8 @@ import java.util.List;
 public class CreateCollectionReq {
     @NonNull
     private String collectionName;
+    @Builder.Default
+    private String description = "";
     private Integer dimension;
 
     @Builder.Default
@@ -29,23 +33,52 @@ public class CreateCollectionReq {
     private String metricType = IndexParam.MetricType.IP.name();
     @Builder.Default
     private Boolean autoID = Boolean.FALSE;
+
+    // used by quickly create collections and create collections with schema
     @Builder.Default
     private Boolean enableDynamicField = Boolean.TRUE;
+    @Builder.Default
+    private Integer numShards = 1;
 
     // create collections with schema
     private CollectionSchema collectionSchema;
 
     private List<IndexParam> indexParams;
 
+    //private String partitionKeyField;
+    private Integer numPartitions;
+
     @Data
     @SuperBuilder
     public static class CollectionSchema {
         @Builder.Default
         private List<CreateCollectionReq.FieldSchema> fieldSchemaList = new ArrayList<>();
-        @Builder.Default
-        private String description = "";
-        @NonNull
-        private Boolean enableDynamicField;
+
+        public void addField(AddFieldReq addFieldReq) {
+            CreateCollectionReq.FieldSchema fieldSchema = FieldSchema.builder()
+                    .name(addFieldReq.getFieldName())
+                    .dataType(addFieldReq.getDataType())
+                    .description(addFieldReq.getDescription())
+                    .isPrimaryKey(addFieldReq.getIsPrimaryKey())
+                    .isPartitionKey(addFieldReq.getIsPartitionKey())
+                    .autoID(addFieldReq.getAutoID())
+                    .build();
+            if (addFieldReq.getDataType().equals(DataType.Array)) {
+                if (addFieldReq.getElementType() == null) {
+                    throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "Element type, maxCapacity are required for array field");
+                }
+                fieldSchema.setElementType(addFieldReq.getElementType());
+                fieldSchema.setMaxCapacity(addFieldReq.getMaxCapacity());
+            } else if (addFieldReq.getDataType().equals(DataType.VarChar)) {
+                fieldSchema.setMaxLength(addFieldReq.getMaxLength());
+            } else if (addFieldReq.getDataType().equals(DataType.FloatVector) || addFieldReq.getDataType().equals(DataType.BinaryVector)) {
+                if (addFieldReq.getDimension() == null) {
+                    throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "Dimension is required for vector field");
+                }
+                fieldSchema.setDimension(addFieldReq.getDimension());
+            }
+            fieldSchemaList.add(fieldSchema);
+        }
 
         public CreateCollectionReq.FieldSchema getField(String fieldName) {
             for (CreateCollectionReq.FieldSchema field : fieldSchemaList) {
@@ -55,65 +88,14 @@ public class CreateCollectionReq {
             }
             return null;
         }
-
-        public void addPrimaryField(String fieldName, DataType dataType, Boolean isPrimaryKey, Boolean autoID) {
-            // primary key field
-            CreateCollectionReq.FieldSchema fieldSchema = CreateCollectionReq.FieldSchema.builder()
-                    .name(fieldName)
-                    .dataType(dataType)
-                    .isPrimaryKey(isPrimaryKey)
-                    .autoID(autoID)
-                    .build();
-            fieldSchemaList.add(fieldSchema);
-        }
-
-        public void addPrimaryField(String fieldName, DataType dataType, Integer maxLength, Boolean isPrimaryKey, Boolean autoID) {
-            // primary key field
-            CreateCollectionReq.FieldSchema fieldSchema = CreateCollectionReq.FieldSchema.builder()
-                    .name(fieldName)
-                    .dataType(dataType)
-                    .maxLength(maxLength)
-                    .isPrimaryKey(isPrimaryKey)
-                    .autoID(autoID)
-                    .build();
-            fieldSchemaList.add(fieldSchema);
-        }
-
-        public void addVectorField(String fieldName, DataType dataType, Integer dimension) {
-            // vector field
-            CreateCollectionReq.FieldSchema fieldSchema = CreateCollectionReq.FieldSchema.builder()
-                    .name(fieldName)
-                    .dataType(dataType)
-                    .dimension(dimension)
-                    .build();
-            fieldSchemaList.add(fieldSchema);
-        }
-
-        public void addScalarField(String fieldName, DataType dataType, Integer maxLength) {
-            // scalar field
-            CreateCollectionReq.FieldSchema fieldSchema = CreateCollectionReq.FieldSchema.builder()
-                    .name(fieldName)
-                    .dataType(dataType)
-                    .maxLength(maxLength)
-                    .build();
-            fieldSchemaList.add(fieldSchema);
-        }
-
-        public void addScalarField(String fieldName, DataType dataType) {
-            // scalar field
-            CreateCollectionReq.FieldSchema fieldSchema = CreateCollectionReq.FieldSchema.builder()
-                    .name(fieldName)
-                    .dataType(dataType)
-                    .build();
-            fieldSchemaList.add(fieldSchema);
-        }
     }
 
     @Data
     @SuperBuilder
     public static class FieldSchema {
-        //TODO: check here
         private String name;
+        @Builder.Default
+        private String description = "";
         private DataType dataType;
         @Builder.Default
         private Integer maxLength = 65535;
@@ -121,6 +103,8 @@ public class CreateCollectionReq {
         @Builder.Default
         private Boolean isPrimaryKey = Boolean.FALSE;
         @Builder.Default
+        private Boolean isPartitionKey = Boolean.FALSE;
+        @Builder.Default
         private Boolean autoID = Boolean.FALSE;
         private DataType elementType;
         private Integer maxCapacity;

+ 1 - 1
src/main/java/io/milvus/v2/service/collection/request/LoadCollectionReq.java

@@ -9,7 +9,7 @@ import lombok.experimental.SuperBuilder;
 public class LoadCollectionReq {
     private String collectionName;
     @Builder.Default
-    private Integer replicaNum = 1;
+    private Integer numReplicas = 1;
     @Builder.Default
     private Boolean async = Boolean.TRUE;
     @Builder.Default

+ 15 - 2
src/main/java/io/milvus/v2/service/index/IndexService.java

@@ -2,6 +2,8 @@ package io.milvus.v2.service.index;
 
 import io.milvus.grpc.*;
 import io.milvus.v2.common.IndexParam;
+import io.milvus.v2.exception.ErrorCode;
+import io.milvus.v2.exception.MilvusClientException;
 import io.milvus.v2.service.BaseService;
 import io.milvus.v2.service.index.request.CreateIndexReq;
 import io.milvus.v2.service.index.request.DescribeIndexReq;
@@ -11,6 +13,7 @@ import io.milvus.v2.service.index.response.DescribeIndexResp;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class IndexService extends BaseService {
 
@@ -76,8 +79,14 @@ public class IndexService extends BaseService {
 
         DescribeIndexResponse response = milvusServiceBlockingStub.describeIndex(describeIndexRequest);
         rpcUtils.handleResponse(title, response.getStatus());
+        List<IndexDescription> indexs = response.getIndexDescriptionsList().stream().filter(index -> index.getIndexName().equals(request.getIndexName()) || index.getFieldName().equals(request.getFieldName())).collect(Collectors.toList());
+        if (indexs.isEmpty()) {
+            throw new MilvusClientException(ErrorCode.SERVER_ERROR, "Index not found");
+        } else if (indexs.size() > 1) {
+            throw new MilvusClientException(ErrorCode.SERVER_ERROR, "More than one index found");
+        }
+        return convertUtils.convertToDescribeIndexResp(indexs.get(0));
 
-        return convertUtils.convertToDescribeIndexResp(response);
     }
 
     public List<String> listIndexes(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub, ListIndexesReq request) {
@@ -85,7 +94,11 @@ public class IndexService extends BaseService {
         DescribeIndexRequest describeIndexRequest = DescribeIndexRequest.newBuilder()
                 .setCollectionName(request.getCollectionName())
                 .build();
-
+        if (request.getFieldName() != null) {
+            describeIndexRequest = describeIndexRequest.toBuilder()
+                    .setFieldName(request.getFieldName())
+                    .build();
+        }
         DescribeIndexResponse response = blockingStub.describeIndex(describeIndexRequest);
         rpcUtils.handleResponse(title, response.getStatus());
         List<String> indexNames = new ArrayList<>();

+ 1 - 0
src/main/java/io/milvus/v2/service/index/request/ListIndexesReq.java

@@ -9,4 +9,5 @@ import lombok.experimental.SuperBuilder;
 public class ListIndexesReq {
     @NonNull
     private String collectionName;
+    private String fieldName;
 }

+ 21 - 7
src/main/java/io/milvus/v2/service/vector/VectorService.java

@@ -2,6 +2,8 @@ package io.milvus.v2.service.vector;
 
 import io.milvus.grpc.*;
 import io.milvus.response.DescCollResponseWrapper;
+import io.milvus.v2.exception.ErrorCode;
+import io.milvus.v2.exception.MilvusClientException;
 import io.milvus.v2.service.BaseService;
 import io.milvus.v2.service.collection.CollectionService;
 import io.milvus.v2.service.collection.request.DescribeCollectionReq;
@@ -51,11 +53,14 @@ public class VectorService extends BaseService {
 
     public QueryResp query(MilvusServiceGrpc.MilvusServiceBlockingStub milvusServiceBlockingStub, QueryReq request) {
         String title = String.format("QueryRequest collectionName:%s", request.getCollectionName());
+        if (request.getFilter() == null && request.getIds() == null) {
+            throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "filter and ids can't be null at the same time");
+        } else if (request.getFilter() != null && request.getIds() != null) {
+            throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "filter and ids can't be set at the same time");
+        }
         checkCollectionExist(milvusServiceBlockingStub, request.getCollectionName());
         DescribeCollectionResp descR = collectionService.describeCollection(milvusServiceBlockingStub, DescribeCollectionReq.builder().collectionName(request.getCollectionName()).build());
-        if(request.getOutputFields() == null){
-            request.setOutputFields(descR.getFieldNames());
-        }
+
         if (request.getIds() != null && request.getFilter() == null) {
             request.setFilter(vectorUtils.getExprById(descR.getPrimaryFieldName(), request.getIds()));
         }
@@ -76,15 +81,15 @@ public class VectorService extends BaseService {
         if (request.getVectorFieldName() == null) {
             request.setVectorFieldName(descR.getVectorFieldName().get(0));
         }
-        if(request.getOutputFields() == null){
-            request.setOutputFields(descR.getFieldNames());
-        }
+
         DescribeIndexReq describeIndexReq = DescribeIndexReq.builder()
                 .collectionName(request.getCollectionName())
                 .fieldName(request.getVectorFieldName())
                 .build();
         DescribeIndexResp respR = indexService.describeIndex(milvusServiceBlockingStub, describeIndexReq);
-
+        if (respR.getMetricType() == null) {
+            throw new MilvusClientException(ErrorCode.SERVER_ERROR, "metric type not found");
+        }
         SearchRequest searchRequest = vectorUtils.ConvertToGrpcSearchRequest(respR.getMetricType(), request);
 
         SearchResults response = milvusServiceBlockingStub.search(searchRequest);
@@ -98,6 +103,11 @@ public class VectorService extends BaseService {
     public DeleteResp delete(MilvusServiceGrpc.MilvusServiceBlockingStub milvusServiceBlockingStub, DeleteReq request) {
         String title = String.format("DeleteRequest collectionName:%s", request.getCollectionName());
         checkCollectionExist(milvusServiceBlockingStub, request.getCollectionName());
+
+        if (request.getFilter() != null && request.getIds() != null) {
+            throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "filter and ids can't be set at the same time");
+        }
+
         DescribeCollectionResp respR = collectionService.describeCollection(milvusServiceBlockingStub, DescribeCollectionReq.builder().collectionName(request.getCollectionName()).build());
         if (request.getFilter() == null) {
             request.setFilter(vectorUtils.getExprById(respR.getPrimaryFieldName(), request.getIds()));
@@ -121,6 +131,10 @@ public class VectorService extends BaseService {
                 .collectionName(request.getCollectionName())
                 .ids(request.getIds())
                 .build();
+        if (request.getOutputFields() != null) {
+            queryReq.setOutputFields(request.getOutputFields());
+        }
+        // call query to get the result
         QueryResp queryResp = query(milvusServiceBlockingStub, queryReq);
 
         return GetResp.builder()

+ 1 - 0
src/main/java/io/milvus/v2/service/vector/request/GetReq.java

@@ -13,4 +13,5 @@ public class GetReq {
     @Builder.Default
     private String partitionName = "";
     private List<Object> ids;
+    private List<String> outputFields;
 }

+ 3 - 1
src/main/java/io/milvus/v2/service/vector/request/QueryReq.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.experimental.SuperBuilder;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 @Data
@@ -14,7 +15,8 @@ public class QueryReq {
     private String collectionName;
     @Builder.Default
     private List<String> partitionNames = new ArrayList<>();
-    private List<String> outputFields;
+    @Builder.Default
+    private List<String> outputFields = Collections.singletonList("*");
     private List<Object> ids;
     private String filter;
     @Builder.Default

+ 2 - 9
src/main/java/io/milvus/v2/service/vector/request/SearchReq.java

@@ -19,12 +19,12 @@ public class SearchReq {
     private String vectorFieldName;
     private int topK;
     private String filter;
-    private List<String> outputFields;
+    @Builder.Default
+    private List<String> outputFields = new ArrayList<>();
     private List<?> data;
     private long offset;
     private long limit;
 
-    //private final Long NQ;
     @Builder.Default
     private int roundDecimal = -1;
     @Builder.Default
@@ -35,11 +35,4 @@ public class SearchReq {
     @Builder.Default
     private ConsistencyLevel consistencyLevel = ConsistencyLevel.BOUNDED;
     private boolean ignoreGrowing;
-
-//    public String getSearchParams() {
-//        Gson gson = new Gson();
-//        String res = gson.toJson(this.searchParams);
-//        System.out.println("searchParams: " + res);
-//        return res;
-//    }
 }

+ 1 - 1
src/main/java/io/milvus/v2/service/vector/response/QueryResp.java

@@ -14,6 +14,6 @@ public class QueryResp {
     @Data
     @SuperBuilder
     public static class QueryResult {
-        private Map<String, Object> fields;
+        private Map<String, Object> entity;
     }
 }

+ 3 - 2
src/main/java/io/milvus/v2/service/vector/response/SearchResp.java

@@ -14,7 +14,8 @@ public class SearchResp {
     @Data
     @SuperBuilder
     public static class SearchResult {
-        private Map<String, Object> fields;
-        private Float score;
+        private Map<String, Object> entity;
+        private Float distance;
+        private Object id;
     }
 }

+ 9 - 8
src/main/java/io/milvus/v2/utils/ConvertUtils.java

@@ -24,7 +24,7 @@ public class ConvertUtils {
             countField.put("count(*)", numOfEntities);
 
             QueryResp.QueryResult queryResult = QueryResp.QueryResult.builder()
-                    .fields(countField)
+                    .entity(countField)
                     .build();
             entities.add(queryResult);
 
@@ -32,7 +32,7 @@ public class ConvertUtils {
         }
         queryResultsWrapper.getRowRecords().forEach(rowRecord -> {
             QueryResp.QueryResult queryResult = QueryResp.QueryResult.builder()
-                    .fields(rowRecord.getFieldValues())
+                    .entity(rowRecord.getFieldValues())
                     .build();
             entities.add(queryResult);
         });
@@ -45,19 +45,20 @@ public class ConvertUtils {
         List<List<SearchResp.SearchResult>> searchResults = new ArrayList<>();
         for (int i = 0; i < numQueries; i++) {
             searchResults.add(searchResultsWrapper.getIDScore(i).stream().map(idScore -> SearchResp.SearchResult.builder()
-                    .fields(idScore.getFieldValues())
-                    .score(idScore.getScore())
+                    .entity(idScore.getFieldValues())
+                    .distance(idScore.getScore())
+                    .id(idScore.getStrID().isEmpty() ? idScore.getLongID() : idScore.getStrID())
                     .build()).collect(Collectors.toList()));
         }
         return searchResults;
     }
 
-    public DescribeIndexResp convertToDescribeIndexResp(DescribeIndexResponse response) {
+    public DescribeIndexResp convertToDescribeIndexResp(IndexDescription response) {
         DescribeIndexResp describeIndexResp = DescribeIndexResp.builder()
-                .indexName(response.getIndexDescriptions(0).getIndexName())
-                .fieldName(response.getIndexDescriptions(0).getFieldName())
+                .indexName(response.getIndexName())
+                .fieldName(response.getFieldName())
                 .build();
-        List<KeyValuePair> params = response.getIndexDescriptions(0).getParamsList();
+        List<KeyValuePair> params = response.getParamsList();
         for(KeyValuePair param : params) {
             if (param.getKey().equals("index_type")) {
                 describeIndexResp.setIndexType(param.getValue());

+ 5 - 2
src/main/java/io/milvus/v2/utils/SchemaUtils.java

@@ -13,13 +13,18 @@ public class SchemaUtils {
     public static FieldSchema convertToGrpcFieldSchema(CreateCollectionReq.FieldSchema fieldSchema) {
         FieldSchema schema = FieldSchema.newBuilder()
                 .setName(fieldSchema.getName())
+                .setDescription(fieldSchema.getDescription())
                 .setDataType(DataType.valueOf(fieldSchema.getDataType().name()))
                 .setIsPrimaryKey(fieldSchema.getIsPrimaryKey())
+                .setIsPartitionKey(fieldSchema.getIsPartitionKey())
                 .setAutoID(fieldSchema.getAutoID())
                 .build();
         if(fieldSchema.getDimension() != null){
             schema = schema.toBuilder().addTypeParams(KeyValuePair.newBuilder().setKey("dim").setValue(String.valueOf(fieldSchema.getDimension())).build()).build();
         }
+//        if (Objects.equals(fieldSchema.getName(), partitionKeyField)) {
+//            schema = schema.toBuilder().setIsPartitionKey(Boolean.TRUE).build();
+//        }
         if(fieldSchema.getDataType() == io.milvus.v2.common.DataType.VarChar && fieldSchema.getMaxLength() != null){
             schema = schema.toBuilder().addTypeParams(KeyValuePair.newBuilder().setKey("max_length").setValue(String.valueOf(fieldSchema.getMaxLength())).build()).build();
         }
@@ -35,8 +40,6 @@ public class SchemaUtils {
 
     public static CreateCollectionReq.CollectionSchema convertFromGrpcCollectionSchema(CollectionSchema schema) {
         CreateCollectionReq.CollectionSchema collectionSchema = CreateCollectionReq.CollectionSchema.builder()
-                .description(schema.getDescription())
-                .enableDynamicField(schema.getEnableDynamicField())
                 .build();
         List<CreateCollectionReq.FieldSchema> fieldSchemas = new ArrayList<>();
         for (FieldSchema fieldSchema : schema.getFieldsList()) {

+ 2 - 1
src/main/java/io/milvus/v2/utils/VectorUtils.java

@@ -8,6 +8,7 @@ import io.milvus.grpc.*;
 import io.milvus.param.Constant;
 import io.milvus.v2.service.vector.request.QueryReq;
 import io.milvus.v2.service.vector.request.SearchReq;
+import org.jetbrains.annotations.NotNull;
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
@@ -80,7 +81,7 @@ public class VectorUtils {
         return guaranteeTimestamp;
     }
 
-    public SearchRequest ConvertToGrpcSearchRequest(String metricType, SearchReq request) {
+    public SearchRequest ConvertToGrpcSearchRequest(@NotNull String metricType, SearchReq request) {
         SearchRequest.Builder builder = SearchRequest.newBuilder()
                 .setDbName("")
                 .setCollectionName(request.getCollectionName());

+ 2 - 5
src/test/java/io/milvus/v2/service/collection/CollectionTest.java

@@ -34,12 +34,9 @@ class CollectionTest extends BaseTest {
     void testCreateCollectionWithSchema() {
 
         CreateCollectionReq.CollectionSchema collectionSchema = CreateCollectionReq.CollectionSchema.builder()
-                .enableDynamicField(Boolean.TRUE)
                 .build();
-        collectionSchema.addPrimaryField("id", DataType.Int64, null, Boolean.TRUE, Boolean.FALSE);
-        collectionSchema.addVectorField("vector", DataType.FloatVector,8);
-        collectionSchema.addScalarField("meta", DataType.VarChar, 100);
-        collectionSchema.addScalarField("age", DataType.Int64);
+        collectionSchema.addField(AddFieldReq.builder().fieldName("id").dataType(DataType.Int64).build());
+        collectionSchema.addField(AddFieldReq.builder().fieldName("vector").dataType(DataType.FloatVector).dimension(2).build());
 
         IndexParam indexParam = IndexParam.builder()
                 .fieldName("vector")