{"id":"716266883ae71e0d","repo":"go-redis/redis","slug":"ft-create-type-dim-and-distancemetric-are-requir","errorCode":null,"errorMessage":"FT.CREATE: Type, Dim and DistanceMetric are required for VECTOR FLAT","messagePattern":"FT\\.CREATE: Type, Dim and DistanceMetric are required for VECTOR FLAT","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"search_commands.go","lineNumber":1489,"sourceCode":"\t\t\tif schema.VectorArgs.FlatOptions != nil {\n\t\t\t\toptionCount++\n\t\t\t}\n\t\t\tif schema.VectorArgs.HNSWOptions != nil {\n\t\t\t\toptionCount++\n\t\t\t}\n\t\t\tif schema.VectorArgs.VamanaOptions != nil {\n\t\t\t\toptionCount++\n\t\t\t}\n\t\t\tif optionCount != 1 {\n\t\t\t\tcmd := NewStatusCmd(ctx, args...)\n\t\t\t\tcmd.SetErr(fmt.Errorf(\"FT.CREATE: SCHEMA VectorArgs must have exactly one of FlatOptions, HNSWOptions, or VamanaOptions\"))\n\t\t\t\treturn cmd\n\t\t\t}\n\t\t\tif schema.VectorArgs.FlatOptions != nil {\n\t\t\t\targs = append(args, \"FLAT\")\n\t\t\t\tif schema.VectorArgs.FlatOptions.Type == \"\" || schema.VectorArgs.FlatOptions.Dim == 0 || schema.VectorArgs.FlatOptions.DistanceMetric == \"\" {\n\t\t\t\t\tcmd := NewStatusCmd(ctx, args...)\n\t\t\t\t\tcmd.SetErr(fmt.Errorf(\"FT.CREATE: Type, Dim and DistanceMetric are required for VECTOR FLAT\"))\n\t\t\t\t\treturn cmd\n\t\t\t\t}\n\t\t\t\tflatArgs := []interface{}{\n\t\t\t\t\t\"TYPE\", schema.VectorArgs.FlatOptions.Type,\n\t\t\t\t\t\"DIM\", schema.VectorArgs.FlatOptions.Dim,\n\t\t\t\t\t\"DISTANCE_METRIC\", schema.VectorArgs.FlatOptions.DistanceMetric,\n\t\t\t\t}\n\t\t\t\tif schema.VectorArgs.FlatOptions.InitialCapacity > 0 {\n\t\t\t\t\tflatArgs = append(flatArgs, \"INITIAL_CAP\", schema.VectorArgs.FlatOptions.InitialCapacity)\n\t\t\t\t}\n\t\t\t\tif schema.VectorArgs.FlatOptions.BlockSize > 0 {\n\t\t\t\t\tflatArgs = append(flatArgs, \"BLOCK_SIZE\", schema.VectorArgs.FlatOptions.BlockSize)\n\t\t\t\t}\n\t\t\t\targs = append(args, len(flatArgs))\n\t\t\t\targs = append(args, flatArgs...)\n\t\t\t}\n\t\t\tif schema.VectorArgs.HNSWOptions != nil {\n\t\t\t\targs = append(args, \"HNSW\")","sourceCodeStart":1471,"sourceCodeEnd":1507,"githubUrl":"https://github.com/go-redis/redis/blob/36d97525cd8076aed67cddf54778e9ea84550929/search_commands.go#L1471-L1507","documentation":"Returned by FTCreate when FlatOptions is selected but Type, Dim, or DistanceMetric is unset (Type==\"\", Dim==0, or DistanceMetric==\"\"). These are the mandatory parameters for a VECTOR FLAT index. The guard is at search_commands.go:1487.","triggerScenarios":"Constructing &redis.FTFlatOptions{} without setting Type (e.g. \"FLOAT32\"), Dim (vector dimensionality > 0), or DistanceMetric (e.g. \"COSINE\", \"L2\", \"IP\").","commonSituations":"Reading Dim from a config/env that defaults to 0, forgetting the distance metric string, or using an unsupported Type token. Note zero Dim is indistinguishable from unset because Dim is an int.","solutions":["Set FlatOptions.Type (\"FLOAT32\"/\"FLOAT16\"/\"BFLOAT16\"), FlatOptions.Dim (>0, matches embedding size), and FlatOptions.DistanceMetric (\"COSINE\"/\"L2\"/\"IP\").","Load Dim from the embedding model config and assert it is non-zero before index creation.","Validate the triplet in a helper before calling FTCreate."],"exampleFix":"// before\n&redis.FTFlatOptions{Type: \"FLOAT32\", Dim: 0}\n\n// after\n&redis.FTFlatOptions{Type: \"FLOAT32\", Dim: 768, DistanceMetric: \"COSINE\"}","handlingStrategy":"validation","validationCode":"o := f.VectorArgs.FlatOptions\nif o.Type == \"\" || o.Dim == 0 || o.DistanceMetric == \"\" {\n    return fmt.Errorf(\"FLAT vector field %q needs Type, Dim>0, DistanceMetric\", f.FieldName)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Derive Dim from the embedding model and assert non-zero at startup.","Pin Type/DistanceMetric to constants from config.","Validate the FlatOptions trio before FTCreate."],"tags":["redisearch","ft-create","vector","flat","validation"],"analyzedSha":"36d97525cd8076aed67cddf54778e9ea84550929","analyzedAt":"2026-08-06T01:08:27.376Z","schemaVersion":2}