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);