Browse Source

Fix bugs related with index (#336)

Signed-off-by: groot <yihua.mo@zilliz.com>
groot 3 years ago
parent
commit
57d3bcfd90

+ 2 - 5
src/main/java/io/milvus/client/AbstractMilvusGrpcClient.java

@@ -66,6 +66,7 @@ public abstract class AbstractMilvusGrpcClient implements MilvusClient {
     ///////////////////// Internal Functions//////////////////////
     ///////////////////// Internal Functions//////////////////////
     private List<KeyValuePair> assembleKvPair(Map<String, String> sourceMap) {
     private List<KeyValuePair> assembleKvPair(Map<String, String> sourceMap) {
         List<KeyValuePair> result = new ArrayList<>();
         List<KeyValuePair> result = new ArrayList<>();
+
         if (MapUtils.isNotEmpty(sourceMap)) {
         if (MapUtils.isNotEmpty(sourceMap)) {
             sourceMap.forEach((key, value) -> {
             sourceMap.forEach((key, value) -> {
                 KeyValuePair kv = KeyValuePair.newBuilder()
                 KeyValuePair kv = KeyValuePair.newBuilder()
@@ -993,7 +994,6 @@ public abstract class AbstractMilvusGrpcClient implements MilvusClient {
         try {
         try {
             CreateIndexRequest.Builder createIndexRequestBuilder = CreateIndexRequest.newBuilder();
             CreateIndexRequest.Builder createIndexRequestBuilder = CreateIndexRequest.newBuilder();
             List<KeyValuePair> extraParamList = assembleKvPair(requestParam.getExtraParam());
             List<KeyValuePair> extraParamList = assembleKvPair(requestParam.getExtraParam());
-
             if (CollectionUtils.isNotEmpty(extraParamList)) {
             if (CollectionUtils.isNotEmpty(extraParamList)) {
                 extraParamList.forEach(createIndexRequestBuilder::addExtraParams);
                 extraParamList.forEach(createIndexRequestBuilder::addExtraParams);
             }
             }
@@ -1011,14 +1011,12 @@ public abstract class AbstractMilvusGrpcClient implements MilvusClient {
                     .build();
                     .build();
             blockingStub().flush(flushRequest);
             blockingStub().flush(flushRequest);
 
 
-
             CreateIndexRequest createIndexRequest = createIndexRequestBuilder.setCollectionName(requestParam.getCollectionName())
             CreateIndexRequest createIndexRequest = createIndexRequestBuilder.setCollectionName(requestParam.getCollectionName())
                     .setFieldName(requestParam.getFieldName())
                     .setFieldName(requestParam.getFieldName())
                     .setIndexName(requestParam.getIndexName())
                     .setIndexName(requestParam.getIndexName())
                     .build();
                     .build();
 
 
             Status response = blockingStub().createIndex(createIndexRequest);
             Status response = blockingStub().createIndex(createIndexRequest);
-
             if (response.getErrorCode() != ErrorCode.Success) {
             if (response.getErrorCode() != ErrorCode.Success) {
                 return failedStatus("CreateIndexRequest", response);
                 return failedStatus("CreateIndexRequest", response);
             }
             }
@@ -1030,7 +1028,6 @@ public abstract class AbstractMilvusGrpcClient implements MilvusClient {
                     return failedStatus("CreateIndexRequest in sync mode", response);
                     return failedStatus("CreateIndexRequest in sync mode", response);
                 }
                 }
             }
             }
-
             logInfo("CreateIndexRequest successfully! Collection name:{} Field name:{}",
             logInfo("CreateIndexRequest successfully! Collection name:{} Field name:{}",
                     requestParam.getCollectionName(), requestParam.getFieldName());
                     requestParam.getCollectionName(), requestParam.getFieldName());
             return R.success(new RpcStatus(RpcStatus.SUCCESS_MSG));
             return R.success(new RpcStatus(RpcStatus.SUCCESS_MSG));
@@ -1856,7 +1853,7 @@ public abstract class AbstractMilvusGrpcClient implements MilvusClient {
     }
     }
 
 
     @Override
     @Override
-    public R<ManualCompactionResponse> manualCompaction(ManualCompactionParam requestParam) {
+    public R<ManualCompactionResponse> manualCompact(ManualCompactParam requestParam) {
         if (!clientIsReady()) {
         if (!clientIsReady()) {
             return R.failed(new ClientNotConnectedException("Client rpc channel is not ready"));
             return R.failed(new ClientNotConnectedException("Client rpc channel is not ready"));
         }
         }

+ 2 - 2
src/main/java/io/milvus/client/MilvusClient.java

@@ -413,10 +413,10 @@ public interface MilvusClient {
     /**
     /**
      * Performs a manual compaction.
      * Performs a manual compaction.
      *
      *
-     * @param requestParam {@link ManualCompactionParam}
+     * @param requestParam {@link ManualCompactParam}
      * @return {status:result code, data:ManualCompactionResponse{status,info}}
      * @return {status:result code, data:ManualCompactionResponse{status,info}}
      */
      */
-    R<ManualCompactionResponse> manualCompaction(ManualCompactionParam requestParam);
+    R<ManualCompactionResponse> manualCompact(ManualCompactParam requestParam);
 
 
     /**
     /**
      * Gets compaction state with its plan.
      * Gets compaction state with its plan.

+ 1 - 1
src/main/java/io/milvus/client/MilvusMultiServiceClient.java

@@ -373,7 +373,7 @@ public class MilvusMultiServiceClient implements MilvusClient {
     }
     }
 
 
     @Override
     @Override
-    public R<ManualCompactionResponse> manualCompaction(ManualCompactionParam requestParam) {
+    public R<ManualCompactionResponse> manualCompact(ManualCompactParam requestParam) {
         return null;
         return null;
     }
     }
 
 

+ 5 - 3
src/main/java/io/milvus/param/IndexType.java

@@ -27,16 +27,18 @@ public enum IndexType {
     INVALID,
     INVALID,
     FLAT,
     FLAT,
     IVF_FLAT,
     IVF_FLAT,
-    IVF_PQ,
     IVF_SQ8,
     IVF_SQ8,
-    IVF_HNSW,
+    IVF_PQ,
     HNSW,
     HNSW,
+    ANNOY,
     RHNSW_FLAT,
     RHNSW_FLAT,
     RHNSW_PQ,
     RHNSW_PQ,
     RHNSW_SQ,
     RHNSW_SQ,
-    ANNOY,
     //Only supported for binary vectors
     //Only supported for binary vectors
     BIN_FLAT,
     BIN_FLAT,
     BIN_IVF_FLAT,
     BIN_IVF_FLAT,
+
+    //Only for varchar type field
+    TRIE,
     ;
     ;
 }
 }

+ 9 - 0
src/main/java/io/milvus/param/ParamUtils.java

@@ -51,6 +51,15 @@ public class ParamUtils {
         return !IsFloatMetric(metric);
         return !IsFloatMetric(metric);
     }
     }
 
 
+    /**
+     * Checks if a index type is for vector.
+     *
+     * @param idx index type
+     */
+    public static boolean IsVectorIndex(IndexType idx) {
+        return idx != IndexType.INVALID && idx != IndexType.TRIE;
+    }
+
     public static InsertRequest convertInsertParam(@NonNull InsertParam requestParam,
     public static InsertRequest convertInsertParam(@NonNull InsertParam requestParam,
                                                    @NonNull List<FieldType> fieldTypes) {
                                                    @NonNull List<FieldType> fieldTypes) {
         String collectionName = requestParam.getCollectionName();
         String collectionName = requestParam.getCollectionName();

+ 9 - 9
src/main/java/io/milvus/param/control/ManualCompactionParam.java → src/main/java/io/milvus/param/control/ManualCompactParam.java

@@ -6,15 +6,15 @@ import lombok.Getter;
 import lombok.NonNull;
 import lombok.NonNull;
 
 
 /**
 /**
- * Parameters for <code>manualCompaction</code> interface.
+ * Parameters for <code>manualCompact</code> interface.
  *
  *
  * @see <a href="https://wiki.lfaidata.foundation/display/MIL/MEP+16+--+Compaction">Compaction function design</a>
  * @see <a href="https://wiki.lfaidata.foundation/display/MIL/MEP+16+--+Compaction">Compaction function design</a>
  */
  */
 @Getter
 @Getter
-public class ManualCompactionParam {
+public class ManualCompactParam {
     private final String collectionName;
     private final String collectionName;
 
 
-    private ManualCompactionParam(@NonNull Builder builder) {
+    private ManualCompactParam(@NonNull Builder builder) {
         this.collectionName = builder.collectionName;
         this.collectionName = builder.collectionName;
     }
     }
 
 
@@ -23,7 +23,7 @@ public class ManualCompactionParam {
     }
     }
 
 
     /**
     /**
-     * Constructs a <code>String</code> by {@link ManualCompactionParam} instance.
+     * Constructs a <code>String</code> by {@link ManualCompactParam} instance.
      *
      *
      * @return <code>String</code>
      * @return <code>String</code>
      */
      */
@@ -35,7 +35,7 @@ public class ManualCompactionParam {
     }
     }
 
 
     /**
     /**
-     * Builder for {@link ManualCompactionParam} class.
+     * Builder for {@link ManualCompactParam} class.
      */
      */
     public static final class Builder {
     public static final class Builder {
         private String collectionName;
         private String collectionName;
@@ -55,14 +55,14 @@ public class ManualCompactionParam {
         }
         }
 
 
         /**
         /**
-         * Verifies parameters and creates a new {@link ManualCompactionParam} instance.
+         * Verifies parameters and creates a new {@link ManualCompactParam} instance.
          *
          *
-         * @return {@link ManualCompactionParam}
+         * @return {@link ManualCompactParam}
          */
          */
-        public ManualCompactionParam build() throws ParamException {
+        public ManualCompactParam build() throws ParamException {
             ParamUtils.CheckNullEmptyString(collectionName, "Collection name");
             ParamUtils.CheckNullEmptyString(collectionName, "Collection name");
 
 
-            return new ManualCompactionParam(this);
+            return new ManualCompactParam(this);
         }
         }
     }
     }
 }
 }

+ 13 - 5
src/main/java/io/milvus/param/index/CreateIndexParam.java

@@ -49,9 +49,15 @@ public class CreateIndexParam {
         this.collectionName = builder.collectionName;
         this.collectionName = builder.collectionName;
         this.fieldName = builder.fieldName;
         this.fieldName = builder.fieldName;
         this.indexName = builder.indexName;
         this.indexName = builder.indexName;
-        this.extraParam.put(Constant.INDEX_TYPE, builder.indexType.name());
-        this.extraParam.put(Constant.METRIC_TYPE, builder.metricType.name());
-        this.extraParam.put(Constant.PARAMS, builder.extraParam);
+        if (builder.indexType != IndexType.INVALID) {
+            this.extraParam.put(Constant.INDEX_TYPE, builder.indexType.name());
+        }
+        if (builder.metricType != MetricType.INVALID) {
+            this.extraParam.put(Constant.METRIC_TYPE, builder.metricType.name());
+        }
+        if (builder.extraParam != null) {
+            this.extraParam.put(Constant.PARAMS, builder.extraParam);
+        }
         this.syncMode = builder.syncMode;
         this.syncMode = builder.syncMode;
         this.syncWaitingInterval = builder.syncWaitingInterval;
         this.syncWaitingInterval = builder.syncWaitingInterval;
         this.syncWaitingTimeout = builder.syncWaitingTimeout;
         this.syncWaitingTimeout = builder.syncWaitingTimeout;
@@ -217,8 +223,10 @@ public class CreateIndexParam {
                 throw new ParamException("Index type is required");
                 throw new ParamException("Index type is required");
             }
             }
 
 
-            if (metricType == MetricType.INVALID) {
-                throw new ParamException("Metric type is required");
+            if (ParamUtils.IsVectorIndex(indexType)) {
+                if (metricType == MetricType.INVALID) {
+                    throw new ParamException("Metric type is required");
+                }
             }
             }
 
 
             if (Objects.equals(syncMode, Boolean.TRUE)) {
             if (Objects.equals(syncMode, Boolean.TRUE)) {

+ 1 - 3
src/main/java/io/milvus/param/index/DescribeIndexParam.java

@@ -84,9 +84,7 @@ public class DescribeIndexParam {
         public DescribeIndexParam build() throws ParamException {
         public DescribeIndexParam build() throws ParamException {
             ParamUtils.CheckNullEmptyString(collectionName, "Collection name");
             ParamUtils.CheckNullEmptyString(collectionName, "Collection name");
 
 
-            if (indexName == null || StringUtils.isBlank(indexName)) {
-                indexName = Constant.DEFAULT_INDEX_NAME;
-            }
+            // if indexName is empty, describeIndex will return all indexes information
 
 
             return new DescribeIndexParam(this);
             return new DescribeIndexParam(this);
         }
         }

+ 2 - 5
src/main/java/io/milvus/response/DescIndexResponseWrapper.java

@@ -9,10 +9,7 @@ import io.milvus.param.MetricType;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.NonNull;
 
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 
 /**
 /**
  * Util class to wrap response of <code>describeIndex</code> interface.
  * Util class to wrap response of <code>describeIndex</code> interface.
@@ -84,7 +81,7 @@ public class DescIndexResponseWrapper {
         public IndexType getIndexType() {
         public IndexType getIndexType() {
             if (this.params.containsKey(Constant.INDEX_TYPE)) {
             if (this.params.containsKey(Constant.INDEX_TYPE)) {
                 // may throw IllegalArgumentException
                 // may throw IllegalArgumentException
-                return IndexType.valueOf(params.get(Constant.INDEX_TYPE));
+                return IndexType.valueOf(params.get(Constant.INDEX_TYPE).toUpperCase(Locale.ROOT));
             }
             }
 
 
             return IndexType.INVALID;
             return IndexType.INVALID;

+ 25 - 3
src/test/java/io/milvus/client/MilvusClientDockerTest.java

@@ -319,9 +319,9 @@ class MilvusClientDockerTest {
                 .withCollectionName(randomCollectionName)
                 .withCollectionName(randomCollectionName)
                 .withFieldName(field2Name)
                 .withFieldName(field2Name)
                 .withIndexName("abv")
                 .withIndexName("abv")
-                .withIndexType(IndexType.IVF_FLAT)
+                .withIndexType(IndexType.HNSW)
                 .withMetricType(MetricType.L2)
                 .withMetricType(MetricType.L2)
-                .withExtraParam("{\"nlist\":256}")
+                .withExtraParam("{\"M\":16,\"efConstruction\":64}")
                 .withSyncMode(Boolean.TRUE)
                 .withSyncMode(Boolean.TRUE)
                 .withSyncWaitingInterval(500L)
                 .withSyncWaitingInterval(500L)
                 .withSyncWaitingTimeout(30L)
                 .withSyncWaitingTimeout(30L)
@@ -442,7 +442,7 @@ class MilvusClientDockerTest {
                 .withTopK(topK)
                 .withTopK(topK)
                 .withVectors(targetVectors)
                 .withVectors(targetVectors)
                 .withVectorFieldName(field2Name)
                 .withVectorFieldName(field2Name)
-                .withParams("{\"nprobe\":8}")
+                .withParams("{\"ef\":64}")
                 .addOutField(field4Name)
                 .addOutField(field4Name)
                 .build();
                 .build();
 
 
@@ -896,6 +896,28 @@ class MilvusClientDockerTest {
         GetCollStatResponseWrapper stat = new GetCollStatResponseWrapper(statR.getData());
         GetCollStatResponseWrapper stat = new GetCollStatResponseWrapper(statR.getData());
         System.out.println("Collection row count: " + stat.getRowCount());
         System.out.println("Collection row count: " + stat.getRowCount());
 
 
+        // create index
+        CreateIndexParam indexParam = CreateIndexParam.newBuilder()
+                .withCollectionName(randomCollectionName)
+                .withFieldName(field3Name)
+                .withIndexName("stridx")
+                .withIndexType(IndexType.TRIE)
+                .withSyncMode(Boolean.TRUE)
+                .withSyncWaitingInterval(500L)
+                .withSyncWaitingTimeout(30L)
+                .build();
+
+        R<RpcStatus> createIndexR = client.createIndex(indexParam);
+        assertEquals(R.Status.Success.getCode(), createIndexR.getStatus().intValue());
+
+        // get index description
+        DescribeIndexParam descIndexParam = DescribeIndexParam.newBuilder()
+                .withCollectionName(randomCollectionName)
+                .withIndexName(indexParam.getIndexName())
+                .build();
+        R<DescribeIndexResponse> descIndexR = client.describeIndex(descIndexParam);
+        assertEquals(R.Status.Success.getCode(), descIndexR.getStatus().intValue());
+
         // load collection
         // load collection
         R<RpcStatus> loadR = client.loadCollection(LoadCollectionParam.newBuilder()
         R<RpcStatus> loadR = client.loadCollection(LoadCollectionParam.newBuilder()
                 .withCollectionName(randomCollectionName)
                 .withCollectionName(randomCollectionName)

+ 3 - 9
src/test/java/io/milvus/client/MilvusServiceClientTest.java

@@ -1229,12 +1229,6 @@ class MilvusServiceClientTest {
     @Test
     @Test
     void describeIndexParam() {
     void describeIndexParam() {
         DescribeIndexParam param = DescribeIndexParam.newBuilder()
         DescribeIndexParam param = DescribeIndexParam.newBuilder()
-                .withCollectionName("collection1")
-                .withIndexName("")
-                .build();
-        assertEquals(Constant.DEFAULT_INDEX_NAME, param.getIndexName());
-
-        param = DescribeIndexParam.newBuilder()
                 .withCollectionName("collection1")
                 .withCollectionName("collection1")
                 .withIndexName("dummy")
                 .withIndexName("dummy")
                 .build();
                 .build();
@@ -2230,12 +2224,12 @@ class MilvusServiceClientTest {
     }
     }
 
 
     @Test
     @Test
-    void manualCompaction() {
-        ManualCompactionParam param = ManualCompactionParam.newBuilder()
+    void manualCompact() {
+        ManualCompactParam param = ManualCompactParam.newBuilder()
                 .withCollectionName("collection1")
                 .withCollectionName("collection1")
                 .build();
                 .build();
 
 
-        testFuncByName("manualCompaction", param);
+        testFuncByName("manualCompact", param);
     }
     }
 
 
     @Test
     @Test