MilvusSchemaBuilder.java 7.72 KB
package com.xly.milvus.util;

import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
import java.util.HashMap;
import java.util.Map;

/**
 * Milvus字段Schema构建工具类
 * 基于源码的 FieldSchema.FieldSchemaBuilder
 */
public class MilvusSchemaBuilder {

    /**
     * 创建主键ID字段(Int64类型,自增)
     */
    public static CreateCollectionReq.FieldSchema createAutoIdField(String fieldName) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(DataType.Int64)
                .isPrimaryKey(true)
                .autoID(true)
                .description("自增主键ID")
                .build();
    }

    /**
     * 创建主键ID字段(String类型,不自增)
     */
    public static CreateCollectionReq.FieldSchema createStringIdField(String fieldName, int maxLength) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(DataType.VarChar)
                .maxLength(maxLength)
                .isPrimaryKey(true)
                .autoID(false)
                .description("业务主键ID")
                .build();
    }

    /**
     * 创建向量字段
     */
    public static CreateCollectionReq.FieldSchema createVectorField(String fieldName, int dimension) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(DataType.FloatVector)
                .dimension(dimension)
                .description("向量字段,维度: " + dimension)
                .build();
    }

    /**
     * 创建文本字段(VarChar类型)
     */
    public static CreateCollectionReq.FieldSchema createTextField(String fieldName, int maxLength) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(DataType.VarChar)
                .maxLength(maxLength)
                .description("文本内容")
                .build();
    }

    /**
     * 创建JSON元数据字段
     */
    public static CreateCollectionReq.FieldSchema createJsonField(String fieldName) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(DataType.JSON)
                .description("JSON元数据")
                .build();
    }

    /**
     * 创建整型字段
     */
    public static CreateCollectionReq.FieldSchema createIntField(String fieldName, String description) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(DataType.Int64)
                .description(description)
                .build();
    }

    /**
     * 创建整型字段(可空)
     */
    public static CreateCollectionReq.FieldSchema createIntField(String fieldName,
                                                                 String description,
                                                                 boolean isNullable) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(DataType.Int64)
                .description(description)
                .isNullable(isNullable)
                .build();
    }

    /**
     * 创建整型字段(带默认值)
     */
    public static CreateCollectionReq.FieldSchema createIntField(String fieldName,
                                                                 String description,
                                                                 long defaultValue) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(DataType.Int64)
                .description(description)
                .defaultValue(defaultValue)
                .build();
    }

    /**
     * 创建浮点型字段
     */
    public static CreateCollectionReq.FieldSchema createFloatField(String fieldName, String description) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(DataType.Float)
                .description(description)
                .build();
    }

    /**
     * 创建布尔型字段
     */
    public static CreateCollectionReq.FieldSchema createBoolField(String fieldName, String description) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(DataType.Bool)
                .description(description)
                .build();
    }

    /**
     * 创建布尔型字段(带默认值)
     */
    public static CreateCollectionReq.FieldSchema createBoolField(String fieldName,
                                                                  String description,
                                                                  boolean defaultValue) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(DataType.Bool)
                .description(description)
                .defaultValue(defaultValue)
                .build();
    }

    /**
     * 创建数组字段
     */
    public static CreateCollectionReq.FieldSchema createArrayField(String fieldName,
                                                                   DataType elementType,
                                                                   int maxCapacity,
                                                                   String description) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(DataType.Array)
                .elementType(elementType)
                .maxCapacity(maxCapacity)
                .description(description)
                .build();
    }

    /**
     * 创建分区键字段
     */
    public static CreateCollectionReq.FieldSchema createPartitionKeyField(String fieldName,
                                                                          DataType dataType,
                                                                          String description) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(dataType)
                .isPartitionKey(true)
                .description(description)
                .build();
    }

    /**
     * 创建聚类键字段
     */
    public static CreateCollectionReq.FieldSchema createClusteringKeyField(String fieldName,
                                                                           DataType dataType,
                                                                           String description) {
        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(dataType)
                .isClusteringKey(true)
                .description(description)
                .build();
    }

    /**
     * 创建带分析器的文本字段(用于全文搜索)
     */
    public static CreateCollectionReq.FieldSchema createAnalyzedTextField(String fieldName,
                                                                          int maxLength,
                                                                          String analyzerType) {
        Map<String, Object> analyzerParams = new HashMap<>();
        analyzerParams.put("type", analyzerType); // "english", "chinese", "standard" 等

        return CreateCollectionReq.FieldSchema.builder()
                .name(fieldName)
                .dataType(DataType.VarChar)
                .maxLength(maxLength)
                .enableAnalyzer(true)
                .analyzerParams(analyzerParams)
                .enableMatch(true)
                .description("支持全文搜索的文本字段")
                .build();
    }
}