{"record":{"id":"f8d7c6005381acbb","repo":"weaviate/weaviate","slug":"explorer-get-class-vector-search-w","errorCode":null,"errorMessage":"explorer: get class: vector search: %w","messagePattern":"explorer: get class: vector search: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"usecases/traverser/explorer.go","lineNumber":244,"sourceCode":"\n\tif len(params.KeywordRanking.Query) == 0 {\n\t\treturn nil, errors.Errorf(\"keyword search (bm25) must have query set\")\n\t}\n\n\tif len(params.AdditionalProperties.ModuleParams) > 0 {\n\t\t// if a module-specific additional prop is set, assume it needs the vector\n\t\t// present for backward-compatibility. This could be improved by actually\n\t\t// asking the module based on specific conditions\n\t\tparams.AdditionalProperties.Vector = true\n\t}\n\n\tres, err := e.searcher.Search(ctx, params)\n\tif err != nil {\n\t\tvar e inverted.MissingIndexError\n\t\tif errors.As(err, &e) {\n\t\t\treturn nil, e\n\t\t}\n\t\treturn nil, fmt.Errorf(\"explorer: get class: vector search: %w\", err)\n\t}\n\n\tres = e.applyBoostIfNeeded(res, params.Boost, false)\n\n\tif e.modulesProvider != nil {\n\t\tres, err = e.modulesProvider.GetExploreAdditionalExtend(ctx, res, params.AdditionalProperties.ModuleParams, nil, params.ModuleParams)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"explorer: get class: extend: %w\", err)\n\t\t}\n\t}\n\n\tif params.GroupBy != nil {\n\t\tgroupedResults, err := e.groupSearchResults(ctx, res, params.GroupBy)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn groupedResults, nil\n\t}","sourceCodeStart":226,"sourceCodeEnd":262,"githubUrl":"https://github.com/weaviate/weaviate/blob/75aa4b6d11f8818305aafd4440b4e32794f7ca04/usecases/traverser/explorer.go#L226-L262","documentation":"Explorer.getClassKeywordBased wraps errors from searcher.Search (the vector/keyword store search) when fetching a class, preserving the underlying cause with %w. Use errors.As to inspect the wrapped cause; a wrapped inverted.MissingIndexError is passed through unwrapped.","triggerScenarios":"VectorSearch underlying failure during Get{Class} — e.g. shard unavailable, corrupted LSM segment, internal index error, or an inverted index missing for the queried property (when not a MissingIndexError).","commonSituations":"Node restarts/shard migration mid-query; querying after a failed import left partial indexes; disk issues on a shard; querying a class while a reindex is in flight on another node.","solutions":["Inspect the wrapped cause with errors.As / check server logs for the root error from searcher.Search","If a property index is missing, trigger reindexing or wait for async indexing to complete","Retry after shard migration/node recovery completes","Verify disk health and LSM store integrity on the affected shard"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// check class & property readiness before querying\nexists, err := client.Schema().ClassExistence().WithClassName(className).Do(ctx)\nif !exists || err != nil { return fmt.Errorf(\"class %s not ready\", className) }","typeGuard":null,"tryCatchPattern":"res, err := client.GraphQL().Get().WithClassName(\"Article\").Do(ctx)\nif err != nil {\n  if errors.Is(err, context.DeadlineExceeded) || isTransient(err) {\n    // retry with backoff; shard may be migrating\n  } else if isMissingIndex(err) {\n    // trigger reindex instead of retrying\n  }\n}","preventionTips":["Monitor /v1/nodes shard health before heavy queries","Retry transient storage errors with exponential backoff","Trigger reindexing when property indexes are reported missing"],"tags":["go","graphql","vector-search","storage"],"backgroundTag":"vector-search-failed","analyzedSha":"75aa4b6d11f8818305aafd4440b4e32794f7ca04","analyzedAt":"2026-09-04T14:58:20.392Z","contentChangedAt":"2026-09-04T14:58:20.392Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}