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

  1. Read the wrapped inner error ('vector index not found for' means the legacy index queue is missing — an internal inconsistency; restart/rebuild shard)
  2. Verify vector dimensions match the configured vectorizer
  3. Check HNSW disk/WAL health for the shard
  4. Retry the PUT to re-run the index update
  5. 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

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


AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04). Data as JSON: /api/errors/7b48a6d0a2671036. Report an issue: GitHub.