weaviate/weaviate · error
normalized distance: %w
Error message
normalized distance: %w
What it means
NormalizedDistance computes (1 - cosine)/2 between two vectors and wraps any error from cosineSim with this prefix. The only source is dimension mismatch, so this error indicates the compared vectors were produced with different dimensionality.
Source
Thrown at usecases/vectorizer/distance.go:24
//
// Copyright © 2016 - 2026 Weaviate B.V. All rights reserved.
//
// CONTACT: hello@weaviate.io
//
package vectorizer
import (
"fmt"
"math"
)
// NormalizedDistance between two arbitrary vectors, errors if dimensions don't
// match, will return results between 0 (no distance) and 1 (maximum distance)
func NormalizedDistance(a, b []float32) (float32, error) {
sim, err := cosineSim(a, b)
if err != nil {
return 1, fmt.Errorf("normalized distance: %w", err)
}
return (1 - sim) / 2, nil
}
func cosineSim(a, b []float32) (float32, error) {
if len(a) != len(b) {
return 0, fmt.Errorf("vectors have different dimensions")
}
var (
sumProduct float64
sumASquare float64
sumBSquare float64
)
for i := range a {
sumProduct += float64(a[i] * b[i])View on GitHub (pinned to 75aa4b6d11)
Solutions
- Ensure both vectors come from the same model/dimension before comparing.
- Re-vectorize the collection after any vectorizer/model change.
- Validate vector lengths at call sites before computing distances.
- Add a pre-call length equality guard in calling code.
Example fix
// before
sim, _ := vectorizer.NormalizedDistance(a, b)
// after
if len(a) != len(b) { return fmt.Errorf("dim mismatch: %d vs %d", len(a), len(b)) }
sim, err := vectorizer.NormalizedDistance(a, b) Defensive patterns
Strategy: validation
Validate before calling
func canCompare(a, b []float32) bool { return len(a) == len(b) && len(a) > 0 } Type guard
func sameDims(a, b []float32) bool { return len(a) == len(b) } Try / catch
sim, err := vectorizer.NormalizedDistance(a, b)
if err != nil {
var dimErr bool = strings.Contains(err.Error(), "different dimensions")
if dimErr { return revectorizeAndRetry() }
return err
} Prevention
- Pin one vectorizer/model per collection and record its dimension.
- Re-vectorize the whole collection after model changes.
- Validate vector length at ingestion time.
- Use named/target vectors consistently in queries.
When it happens
Trigger: Calling vectorizer.NormalizedDistance(a, b) where len(a) != len(b) — e.g. mixing vectors from different vectorizers, different target vectors, or before/after a vectorizer model change.
Common situations: Schema migration changing vectorizer/model (dimension change) while old vectors remain; comparing cross-target-vector embeddings in multi-vector setups; hand-built vectors with wrong length.
Related errors
- vectors have different dimensions
- empty config
- imageFields not present
- empty vector
- OctoAI is permanently shut down
AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04).
Data as JSON: /api/errors/5d21a90b51871144.
Report an issue: GitHub.