Browse Source

add listIndexes api, fix bug for metricType name and query filter/ids, etc (#772)

Signed-off-by: Nian Liu <nian.liu@zilliz.com>
Nian Liu 1 year ago
parent
commit
84ac96acbd

+ 8 - 2
src/main/java/io/milvus/v2/client/ConnectConfig.java

@@ -32,8 +32,7 @@ public class ConnectConfig {
     private String serverPemPath;
     private String serverName;
 
-    @Builder.Default
-    private boolean secure = true;
+    private Boolean secure;
     @Builder.Default
     private long idleTimeoutMs = TimeUnit.MILLISECONDS.convert(24, TimeUnit.HOURS);
 
@@ -55,4 +54,11 @@ public class ConnectConfig {
         }
         return null;
     }
+
+    public Boolean isSecure() {
+        if (secure != null) {
+            return secure;
+        }
+        return token != null || username != null || password != null;
+    }
 }

+ 10 - 6
src/main/java/io/milvus/v2/client/MilvusClientV2.java

@@ -11,6 +11,7 @@ import io.milvus.v2.service.index.IndexService;
 import io.milvus.v2.service.index.request.CreateIndexReq;
 import io.milvus.v2.service.index.request.DescribeIndexReq;
 import io.milvus.v2.service.index.request.DropIndexReq;
+import io.milvus.v2.service.index.request.ListIndexesReq;
 import io.milvus.v2.service.index.response.DescribeIndexResp;
 import io.milvus.v2.service.partition.PartitionService;
 import io.milvus.v2.service.partition.request.*;
@@ -20,10 +21,7 @@ import io.milvus.v2.service.rbac.request.*;
 import io.milvus.v2.service.rbac.response.DescribeRoleResp;
 import io.milvus.v2.service.rbac.response.DescribeUserResp;
 import io.milvus.v2.service.utility.UtilityService;
-import io.milvus.v2.service.utility.request.AlterAliasReq;
-import io.milvus.v2.service.utility.request.CreateAliasReq;
-import io.milvus.v2.service.utility.request.DescribeAliasReq;
-import io.milvus.v2.service.utility.request.DropAliasReq;
+import io.milvus.v2.service.utility.request.*;
 import io.milvus.v2.service.utility.response.DescribeAliasResp;
 import io.milvus.v2.service.utility.response.ListAliasResp;
 import io.milvus.v2.service.vector.VectorService;
@@ -232,6 +230,12 @@ public class MilvusClientV2 {
         return indexService.describeIndex(this.blockingStub, request);
     }
 
+    /**
+     * Lists all indexes in a collection in Milvus.
+     */
+    public List<String> listIndexes(ListIndexesReq request) {
+        return indexService.listIndexes(this.blockingStub, request);
+    }
     // Vector Operations
 
     /**
@@ -480,8 +484,8 @@ public class MilvusClientV2 {
      *
      * @return List<String> alias names
      */
-    public ListAliasResp listAliases() {
-        return utilityService.listAliases(this.blockingStub);
+    public ListAliasResp listAliases(ListAliasesReq request) {
+        return utilityService.listAliases(this.blockingStub, request);
     }
     /**
      * describe aliases

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

@@ -3,11 +3,8 @@ package io.milvus.v2.service.collection.request;
 import lombok.Data;
 import lombok.experimental.SuperBuilder;
 
-import java.util.List;
-
 @Data
 @SuperBuilder
 public class LoadCollectionReq {
     private String collectionName;
-    private List<String> partitionNames;
 }

+ 0 - 3
src/main/java/io/milvus/v2/service/collection/request/ReleaseCollectionReq.java

@@ -3,11 +3,8 @@ package io.milvus.v2.service.collection.request;
 import lombok.Data;
 import lombok.experimental.SuperBuilder;
 
-import java.util.List;
-
 @Data
 @SuperBuilder
 public class ReleaseCollectionReq {
     private String collectionName;
-    private List<String> partitionNames;
 }

+ 32 - 4
src/main/java/io/milvus/v2/service/index/IndexService.java

@@ -6,8 +6,12 @@ import io.milvus.v2.service.BaseService;
 import io.milvus.v2.service.index.request.CreateIndexReq;
 import io.milvus.v2.service.index.request.DescribeIndexReq;
 import io.milvus.v2.service.index.request.DropIndexReq;
+import io.milvus.v2.service.index.request.ListIndexesReq;
 import io.milvus.v2.service.index.response.DescribeIndexResp;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class IndexService extends BaseService {
 
     public void createIndex(MilvusServiceGrpc.MilvusServiceBlockingStub milvusServiceBlockingStub, CreateIndexReq request) {
@@ -20,7 +24,7 @@ public class IndexService extends BaseService {
                     .setFieldName(indexParam.getFieldName())
                     .addExtraParams(KeyValuePair.newBuilder()
                             .setKey("index_type")
-                            .setValue(String.valueOf(indexParam.getIndexType()))
+                            .setValue(indexParam.getIndexType().getName())
                             .build())
                     .build();
             if(indexParam.getMetricType()!= null){
@@ -28,7 +32,7 @@ public class IndexService extends BaseService {
                 createIndexRequest = createIndexRequest.toBuilder()
                         .addExtraParams(KeyValuePair.newBuilder()
                                 .setKey("metric_type")
-                                .setValue(String.valueOf(indexParam.getMetricType()))
+                                .setValue(indexParam.getMetricType().name())
                                 .build())
                         .build();
             }
@@ -66,13 +70,37 @@ public class IndexService extends BaseService {
                 request.getCollectionName(), request.getFieldName(), request.getIndexName());
         DescribeIndexRequest describeIndexRequest = DescribeIndexRequest.newBuilder()
                 .setCollectionName(request.getCollectionName())
-                .setFieldName(request.getFieldName())
-                .setIndexName(request.getIndexName())
+//                .setFieldName(request.getFieldName())
+//                .setIndexName(request.getIndexName())
                 .build();
+        if (request.getFieldName() != null) {
+            describeIndexRequest = describeIndexRequest.toBuilder()
+                    .setFieldName(request.getFieldName())
+                    .build();
+        } else if (request.getIndexName() != null) {
+            describeIndexRequest = describeIndexRequest.toBuilder()
+                    .setIndexName(request.getIndexName())
+                    .build();
+        }
 
         DescribeIndexResponse response = milvusServiceBlockingStub.describeIndex(describeIndexRequest);
         rpcUtils.handleResponse(title, response.getStatus());
 
         return convertUtils.convertToDescribeIndexResp(response);
     }
+
+    public List<String> listIndexes(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub, ListIndexesReq request) {
+        String title = String.format("ListIndexesRequest collectionName:%s", request.getCollectionName());
+        DescribeIndexRequest describeIndexRequest = DescribeIndexRequest.newBuilder()
+                .setCollectionName(request.getCollectionName())
+                .build();
+
+        DescribeIndexResponse response = blockingStub.describeIndex(describeIndexRequest);
+        rpcUtils.handleResponse(title, response.getStatus());
+        List<String> indexNames = new ArrayList<>();
+        response.getIndexDescriptionsList().forEach(index -> {
+            indexNames.add(index.getIndexName());
+        });
+        return indexNames;
+    }
 }

+ 1 - 3
src/main/java/io/milvus/v2/service/index/request/DescribeIndexReq.java

@@ -1,6 +1,5 @@
 package io.milvus.v2.service.index.request;
 
-import lombok.Builder;
 import lombok.Data;
 import lombok.experimental.SuperBuilder;
 
@@ -9,6 +8,5 @@ import lombok.experimental.SuperBuilder;
 public class DescribeIndexReq {
     private String collectionName;
     private String fieldName;
-    @Builder.Default
-    private String indexName = "";
+    private String indexName;
 }

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

@@ -0,0 +1,12 @@
+package io.milvus.v2.service.index.request;
+
+import lombok.Data;
+import lombok.NonNull;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+public class ListIndexesReq {
+    @NonNull
+    private String collectionName;
+}

+ 2 - 1
src/main/java/io/milvus/v2/service/utility/UtilityService.java

@@ -64,9 +64,10 @@ public class UtilityService extends BaseService {
                 .build();
     }
 
-    public ListAliasResp listAliases(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub) {
+    public ListAliasResp listAliases(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub, ListAliasesReq request) {
         String title = "List aliases";
         io.milvus.grpc.ListAliasesRequest listAliasesRequest = io.milvus.grpc.ListAliasesRequest.newBuilder()
+                .setCollectionName(request.getCollectionName())
                 .build();
         io.milvus.grpc.ListAliasesResponse response = blockingStub.listAliases(listAliasesRequest);
 

+ 10 - 0
src/main/java/io/milvus/v2/service/utility/request/ListAliasesReq.java

@@ -0,0 +1,10 @@
+package io.milvus.v2.service.utility.request;
+
+import lombok.Data;
+import lombok.experimental.SuperBuilder;
+
+@Data
+@SuperBuilder
+public class ListAliasesReq {
+    private String collectionName;
+}

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

@@ -56,7 +56,7 @@ public class VectorService extends BaseService {
         if(request.getOutputFields() == null){
             request.setOutputFields(descR.getFieldNames());
         }
-        if(request.getIds() != null){
+        if (request.getIds() != null && request.getFilter() == null) {
             request.setFilter(vectorUtils.getExprById(descR.getPrimaryFieldName(), request.getIds()));
         }
         QueryResults response = milvusServiceBlockingStub.query(vectorUtils.ConvertToGrpcQueryRequest(request));
@@ -99,13 +99,13 @@ public class VectorService extends BaseService {
         String title = String.format("DeleteRequest collectionName:%s", request.getCollectionName());
         checkCollectionExist(milvusServiceBlockingStub, request.getCollectionName());
         DescribeCollectionResp respR = collectionService.describeCollection(milvusServiceBlockingStub, DescribeCollectionReq.builder().collectionName(request.getCollectionName()).build());
-        if(request.getExpr() == null){
-            request.setExpr(vectorUtils.getExprById(respR.getPrimaryFieldName(), request.getIds()));
+        if (request.getFilter() == null) {
+            request.setFilter(vectorUtils.getExprById(respR.getPrimaryFieldName(), request.getIds()));
         }
         DeleteRequest deleteRequest = DeleteRequest.newBuilder()
                 .setCollectionName(request.getCollectionName())
                 .setPartitionName(request.getPartitionName())
-                .setExpr(request.getExpr())
+                .setExpr(request.getFilter())
                 .build();
         MutationResult response = milvusServiceBlockingStub.delete(deleteRequest);
         rpcUtils.handleResponse(title, response.getStatus());

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

@@ -12,6 +12,6 @@ public class DeleteReq {
     private String collectionName;
     @Builder.Default
     private String partitionName = "";
-    private String expr;
+    private String filter;
     private List<Object> ids;
 }

+ 10 - 1
src/main/java/io/milvus/v2/service/vector/request/SearchReq.java

@@ -6,7 +6,9 @@ import lombok.Data;
 import lombok.experimental.SuperBuilder;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Data
 @SuperBuilder
@@ -26,11 +28,18 @@ public class SearchReq {
     @Builder.Default
     private int roundDecimal = -1;
     @Builder.Default
-    private String searchParams = "{}";
+    private Map<String, Object> searchParams = new HashMap<>();
     private long guaranteeTimestamp;
     @Builder.Default
     private Long gracefulTime = 5000L;
     @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/SearchResp.java

@@ -9,7 +9,7 @@ import java.util.Map;
 @Data
 @SuperBuilder
 public class SearchResp {
-    private List<SearchResult> searchResults;
+    private List<List<SearchResult>> searchResults;
 
     @Data
     @SuperBuilder

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

@@ -72,7 +72,7 @@ public class ClientUtils {
                         .keepAliveWithoutCalls(connectConfig.isKeepAliveWithoutCalls())
                         .idleTimeout(connectConfig.getIdleTimeoutMs(), TimeUnit.MILLISECONDS)
                         .intercept(MetadataUtils.newAttachHeadersInterceptor(metadata));
-                if(connectConfig.isSecure()){
+                if (connectConfig.getSecure()) {
                     builder.useTransportSecurity();
                 }
                 if (StringUtils.isNotEmpty(connectConfig.getServerName())) {

+ 10 - 6
src/main/java/io/milvus/v2/utils/ConvertUtils.java

@@ -39,13 +39,17 @@ public class ConvertUtils {
         return entities;
     }
 
-    public List<SearchResp.SearchResult> getEntities(SearchResults response) {
+    public List<List<SearchResp.SearchResult>> getEntities(SearchResults response) {
         SearchResultsWrapper searchResultsWrapper = new SearchResultsWrapper(response.getResults());
-
-        return searchResultsWrapper.getIDScore(0).stream().map(idScore -> SearchResp.SearchResult.builder()
-                .fields(idScore.getFieldValues())
-                .score(idScore.getScore())
-                .build()).collect(Collectors.toList());
+        long numQueries = response.getResults().getNumQueries();
+        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())
+                    .build()).collect(Collectors.toList()));
+        }
+        return searchResults;
     }
 
     public DescribeIndexResp convertToDescribeIndexResp(DescribeIndexResponse response) {

+ 8 - 3
src/main/java/io/milvus/v2/utils/VectorUtils.java

@@ -1,5 +1,6 @@
 package io.milvus.v2.utils;
 
+import com.google.gson.Gson;
 import com.google.protobuf.ByteString;
 import io.milvus.common.clientenum.ConsistencyLevelEnum;
 import io.milvus.exception.ParamException;
@@ -10,7 +11,9 @@ import io.milvus.v2.service.vector.request.SearchReq;
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 public class VectorUtils {
 
@@ -162,12 +165,14 @@ public class VectorUtils {
                         .setValue(String.valueOf(request.getOffset()))
                         .build());
 
-        if (null != request.getSearchParams() && !request.getSearchParams().isEmpty()) {
+        if (null != request.getSearchParams()) {
             try {
+                Gson gson = new Gson();
+                String searchParams = gson.toJson(request.getSearchParams());
                 builder.addSearchParams(
                         KeyValuePair.newBuilder()
                                 .setKey(Constant.PARAMS)
-                                .setValue(request.getSearchParams())
+                                .setValue(searchParams)
                                 .build());
             } catch (IllegalArgumentException e) {
                 throw new ParamException(e.getMessage() + e.getCause().getMessage());

+ 10 - 0
src/test/java/io/milvus/v2/service/index/IndexTest.java

@@ -5,6 +5,7 @@ import io.milvus.v2.common.IndexParam;
 import io.milvus.v2.service.index.request.CreateIndexReq;
 import io.milvus.v2.service.index.request.DescribeIndexReq;
 import io.milvus.v2.service.index.request.DropIndexReq;
+import io.milvus.v2.service.index.request.ListIndexesReq;
 import io.milvus.v2.service.index.response.DescribeIndexResp;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
@@ -55,4 +56,13 @@ class IndexTest extends BaseTest {
                 .build();
         client_v2.dropIndex(dropIndexReq);
     }
+
+    @Test
+    void testListIndexes() {
+        ListIndexesReq listIndexesReq = ListIndexesReq.builder()
+                .collectionName("test")
+                .build();
+        List<String> indexNames = client_v2.listIndexes(listIndexesReq);
+        logger.info(indexNames.toString());
+    }
 }

+ 5 - 5
src/test/java/io/milvus/v2/service/utility/UtilityTest.java

@@ -1,10 +1,7 @@
 package io.milvus.v2.service.utility;
 
 import io.milvus.v2.BaseTest;
-import io.milvus.v2.service.utility.request.AlterAliasReq;
-import io.milvus.v2.service.utility.request.CreateAliasReq;
-import io.milvus.v2.service.utility.request.DescribeAliasReq;
-import io.milvus.v2.service.utility.request.DropAliasReq;
+import io.milvus.v2.service.utility.request.*;
 import io.milvus.v2.service.utility.response.DescribeAliasResp;
 import io.milvus.v2.service.utility.response.ListAliasResp;
 import org.junit.jupiter.api.Test;
@@ -48,6 +45,9 @@ class UtilityTest extends BaseTest {
     }
     @Test
     void listAliases() {
-        ListAliasResp statusR = client_v2.listAliases();
+        ListAliasesReq req = ListAliasesReq.builder()
+                .collectionName("test")
+                .build();
+        ListAliasResp statusR = client_v2.listAliases(req);
     }
 }

+ 14 - 9
src/test/java/io/milvus/v2/service/vector/VectorTest.java

@@ -18,16 +18,21 @@ class VectorTest extends BaseTest {
 
     @Test
     void testInsert() {
-        JSONObject vector = new JSONObject();
-        List<Float> vectorList = new ArrayList<>();
-        vectorList.add(1.0f);
-        vectorList.add(2.0f);
-        vector.put("vector", vectorList);
-        vector.put("id", 0L);
+
+        List<JSONObject> data = new ArrayList<>();
+        for (int i = 0; i < 100; i++) {
+            JSONObject vector = new JSONObject();
+            List<Float> vectorList = new ArrayList<>();
+            vectorList.add(1.0f);
+            vectorList.add(2.0f);
+            vector.put("vector", vectorList);
+            vector.put("id", (long) i);
+            data.add(vector);
+        }
 
         InsertReq request = InsertReq.builder()
-                .collectionName("test2")
-                .data(Collections.singletonList(vector))
+                .collectionName("test")
+                .data(data)
                 .build();
         InsertResp statusR = client_v2.insert(request);
         logger.info(statusR.toString());
@@ -83,7 +88,7 @@ class VectorTest extends BaseTest {
     void testDelete() {
         DeleteReq request = DeleteReq.builder()
                 .collectionName("test")
-                .expr("id > 0")
+                .filter("id > 0")
                 .build();
         DeleteResp statusR = client_v2.delete(request);
         logger.info(statusR.toString());