weaviate/weaviate · warning

not an hfresh index

Error message

not an hfresh index

What it means

The found vector index is type-asserted to the hfreshReassignAller interface. If the index implementation does not support reassign-all (i.e. it is HNSW, flat, dynamic — anything but hfresh), the handler returns HTTP 400 "not an hfresh index". Requantize/reassign-all is a capability of the hfresh index type only.

Source

Thrown at adapters/handlers/rest/handlers_debug.go:273

		if shard == nil {
			release()
			logger.WithField("shard", shardName).Error("shard not found")
			http.Error(w, "shard not found", http.StatusNotFound)
			return
		}

		vidx, ok := shard.GetVectorIndex(targetVector)
		if !ok {
			release()
			logger.WithField("shard", shardName).Error("vector index not found")
			http.Error(w, "vector index not found", http.StatusNotFound)
			return
		}

		h, ok := vidx.(hfreshReassignAller)
		if !ok {
			release()
			http.Error(w, "not an hfresh index", http.StatusBadRequest)
			return
		}

		// The scan needs no shard reference: EnqueueReassignAll also watches
		// the index's own lifecycle context and stops when the shard shuts
		// down or is dropped, like the version map warmup does.
		release()

		reassignLogger := logger.
			WithField("collection", colName).
			WithField("shard", shardName).
			WithField("targetVector", targetVector)

		enterrors.GoWrapper(func() {
			stats, err := h.EnqueueReassignAll(context.Background())
			statsLogger := reassignLogger.
				WithField("postings", stats.Postings).
				WithField("enqueued", stats.Enqueued).

View on GitHub (pinned to 75aa4b6d11)

Solutions

  1. Confirm the vector index type in the schema (vectorIndexType). Only hfresh supports this operation.
  2. If requantization is needed on an HNSW index, use its own compression/quantizer endpoints instead of this debug handler.
  3. If hfresh is required, recreate the collection (or a new target vector) with vectorIndexType=hfresh and re-import data.

Example fix

// before (400): index is hnsw
{"vectorIndexType": "hnsw"}

// after: use an hfresh target
collection vectorIndexType=hfresh, then POST reassign with that vector name
Defensive patterns

Strategy: type-guard

Validate before calling

async function assertHfresh(base, col) {
  const cls = await (await fetch(`${base}/v1/schema/${col}`)).json();
  const types = [cls.vectorIndexType, ...Object.values(cls.vectorConfig || {})
    .map(v => v.vectorIndexType)].filter(Boolean);
  if (types.length && !types.every(t => t === "hfresh"))
    throw new Error(`reassign-all requires hfresh; found: ${types.join(", ")}`);
}

Type guard

const isHfresh = (cls) =>
  cls.vectorIndexType === "hfresh" ||
  Object.values(cls.vectorConfig || {}).every(v => v.vectorIndexType === "hfresh");

Try / catch

// 400 here is a capability mismatch — never retry
if (resp.status === 400 && body === "not an hfresh index") {
  throw new Error("Requantize/reassign is only supported for hfresh vector indexes");
}

Prevention

When it happens

Trigger: POST /debug/index/reassign/vector?...&vector=Z where the shard's vector index for Z is any vector index type other than hfresh — e.g. a standard HNSW index created with the hnsw vectorIndexType, or a flat/dynamic index.

Common situations: Collections using the default hnsw index type; admins attempting the reassign procedure on indexes that were never created with the hfresh backend; mixing vector targets where one is hfresh and another is hnsw.

Related errors


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