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
- Confirm the vector index type in the schema (vectorIndexType). Only hfresh supports this operation.
- If requantization is needed on an HNSW index, use its own compression/quantizer endpoints instead of this debug handler.
- 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
- Check vectorIndexType in the schema before attempting hfresh-only debug operations
- Use the hnsw-specific compression endpoints for HNSW quantizer work
- Plan recreations with vectorIndexType=hfresh if reassign-all is required
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
- targetVector '%s' vector index: config is not schema.VectorI
- invalid hnsw configuration
- invalid flat configuration
- unsupported distance type '%s', HFresh only supports 'cosine
- maxPostingSizeKB is '%d' but must be at least %d
AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04).
Data as JSON: /api/errors/aa26eacd0daf430f.
Report an issue: GitHub.