java调用milvus流程

pclin
63
2024-01-08

1、创建collection

   private static void createCollection()
    {
        FieldType fieldType0 = FieldType.newBuilder().withName("id").withDataType(DataType.Int64)
                                        .withPrimaryKey(true).withAutoID(true).build();
        FieldType fieldType1 = FieldType.newBuilder().withName("path")
                                        .withDataType(DataType.VarChar).withMaxLength(128)
                                        .withPrimaryKey(false).withAutoID(false).build();
        FieldType fieldType2 = FieldType.newBuilder().withName("name")
                                        .withDataType(DataType.VarChar).withMaxLength(128).build();
        FieldType fieldType3 = FieldType.newBuilder().withName("vectors")
                                        .withDataType(DataType.FloatVector).withDimension(10000)
                                        .build();
        CreateCollectionParam createCollectionReq = CreateCollectionParam.newBuilder()
                                                                         .withCollectionName("imgCol")
                                                                         .withDescription("Test book search")
                                                                         .withShardsNum(2)
                                                                         .addFieldType(fieldType0)
                                                                         .addFieldType(fieldType1)
                                                                         .addFieldType(fieldType2)
                                                                         .addFieldType(fieldType3)
                                                                         .withEnableDynamicField(true)
                                                                         .build();
        milvusClient.createCollection(createCollectionReq);
    }

2、插入数据

    private static void insert2Milvus(List<Img> imgList)
    {
        List<String> pathList = new ArrayList<>();
        List<String> nameList = new ArrayList<>();
        List<List<Float>> imgVectors = new ArrayList<>();
        imgList.forEach(img -> {
            pathList.add(img.getPath());
            nameList.add(img.getName());
            imgVectors.add(img.getVectors());
        });
        List<InsertParam.Field> fields = new ArrayList<>();
        fields.add(new InsertParam.Field("path", pathList));
        fields.add(new InsertParam.Field("name", nameList));
        fields.add(new InsertParam.Field("vectors", imgVectors));
        InsertParam insertParam = InsertParam.newBuilder().withCollectionName("imgCol")
                                             .withFields(fields).build();
        milvusClient.insert(insertParam);
        milvusClient.flush(FlushParam.newBuilder().addCollectionName("imgCol").withSyncFlush(true)
                                     .build());

    }

3、创建索引

   		final IndexType INDEX_TYPE = IndexType.FLAT;   // IndexType
        final String INDEX_PARAM = "{\"nlist\":10000}";     // ExtraParam
        milvusClient.createIndex(CreateIndexParam.newBuilder().withCollectionName("imgCol")
                                                 .withFieldName("vectors").withIndexType(INDEX_TYPE)
                                                 .withMetricType(MetricType.L2)
                                                 .withExtraParam(INDEX_PARAM)
                                                 .withSyncMode(Boolean.FALSE).build());

4、加载collection到内存

milvusClient.loadCollection(LoadCollectionParam.newBuilder().withCollectionName("imgCol")
                                                       .build());

5、搜索

		final Integer SEARCH_K = 2;                       // TopK
        final String SEARCH_PARAM = "{\"nprobe\":10, \"offset\":5}";    // Params
        List<String> search_output_fields = Arrays.asList("path", "name");
        List<List<Float>> search_vectors = Arrays.asList(convert2Vector("D:/data/milvus/test/source.jpg"));
        SearchParam searchParam = SearchParam.newBuilder().withCollectionName("imgCol")
                                             .withConsistencyLevel(ConsistencyLevelEnum.STRONG)
                                             .withMetricType(MetricType.L2)
                                             .withOutFields(search_output_fields).withTopK(SEARCH_K)
                                             .withVectors(search_vectors)
                                             .withVectorFieldName("vectors")
                                             .withParams(SEARCH_PARAM).build();
    

        R<SearchResults> respSearch = milvusClient.search(searchParam);

动物装饰