weaviate/weaviate · error
update vector index
Error message
update vector index
What it means
Wraps failure of the legacy (unnamed, pre-named-vectors) single-vector index update in putOne. Only fired when s.hasLegacyVectorIndex() is true, i.e. classes created before named vectors that still use the top-level 'vector' field. Means the object row is stored but not searchable by the legacy vector index.
Source
Thrown at adapters/repos/db/shard_write_put.go:80
// https://github.com/weaviate/weaviate/issues/3949
if status.skipUpsert {
return nil
}
for targetVector, vector := range object.Vectors {
if err := s.updateVectorIndex(ctx, vector, status, targetVector); err != nil {
return errors.Wrapf(err, "update vector index for target vector %s", targetVector)
}
}
for targetVector, multiVector := range object.MultiVectors {
if err := s.updateMultiVectorIndex(ctx, multiVector, status, targetVector); err != nil {
return errors.Wrapf(err, "update multi vector index for target vector %s", targetVector)
}
}
if s.hasLegacyVectorIndex() {
if err := s.updateVectorIndex(ctx, object.Vector, status, ""); err != nil {
return errors.Wrap(err, "update vector index")
}
}
if err := s.updatePropertySpecificIndices(ctx, object, status); err != nil {
return errors.Wrap(err, "update property-specific indices")
}
if err := s.store.WriteWALs(); err != nil {
return errors.Wrap(err, "flush all buffered WALs")
}
if err := s.GetPropertyLengthTracker().Flush(); err != nil {
return errors.Wrap(err, "flush prop length tracker to disk")
}
return nil
}
View on GitHub (pinned to 75aa4b6d11)
Solutions
- Read the wrapped inner error ('vector index not found for' means the legacy index queue is missing — an internal inconsistency; restart/rebuild shard)
- Verify vector dimensions match the configured vectorizer
- Check HNSW disk/WAL health for the shard
- Retry the PUT to re-run the index update
- If migrating schemas, ensure legacy and named vectors are mutually consistent
Defensive patterns
Strategy: try-catch
Validate before calling
// validate legacy vector dims against vectorizer before send
if len(obj.Vector) > 0 && len(obj.Vector) != legacyDims {
return fmt.Errorf("legacy vector dim mismatch")
} Try / catch
if err := put.Do(ctx); err != nil {
if strings.Contains(err.Error(), "update vector index") {
// retry; check HNSW health and dimension config
}
} Prevention
- Avoid mixing legacy single-vector and named-vector fields in one write
- Re-check vectorizer dimensions after module upgrades
- Monitor HNSW commit log disk usage
When it happens
Trigger: PUT on a legacy-indexed class where updateVectorInVectorIndex fails: queue lookup fails for the unnamed target (""), old docID delete fails on update, vector dimension validation fails, or HNSW insert/WAL flush errors.
Common situations: Migrating from single-vector to named-vector schema while legacy index still active, vector dimension mismatch after changing vectorizer, HNSW commit log issues, disk full.
Related errors
- index is not hnsw
- drop vector index %q: %w
- delete from vector index of vector %q: %w
- vector index config (%T) is not of type HNSW, but objects ma
- init vector index
AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04).
Data as JSON: /api/errors/7b48a6d0a2671036.
Report an issue: GitHub.