{"record":{"id":"37e43b4c4133c720","repo":"spring-projects/spring-ai","slug":"failed-to-delete-all-documents","errorCode":null,"errorMessage":"Failed to delete all documents","messagePattern":"Failed to delete all documents","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java","lineNumber":191,"sourceCode":"\n\t@Override\n\tpublic void doDelete(List<String> idList) {\n\t\tDeleteDocumentsParameters deleteDocumentsParameters = new DeleteDocumentsParameters();\n\t\t// Typesense filter_by for the id field expects bare string values, not quoted\n\t\t// literals — e.g. id: [id1,id2]. Typesense document IDs are restricted to\n\t\t// URL-safe characters (no commas, brackets, or quotes), so raw string joining\n\t\t// is safe here. The operator is `: ` (not `:=`) per the Typesense recommendation\n\t\t// for multi-value id filters.\n\t\tdeleteDocumentsParameters.filterBy(DOC_ID_FIELD_NAME + \": [\" + String.join(\",\", idList) + \"]\");\n\n\t\ttry {\n\t\t\tint deletedDocs = (Integer) this.client.collections(this.collectionName)\n\t\t\t\t.documents()\n\t\t\t\t.delete(deleteDocumentsParameters)\n\t\t\t\t.getOrDefault(\"num_deleted\", 0);\n\n\t\t\tif (deletedDocs < idList.size()) {\n\t\t\t\tlogger.warn(\"Failed to delete all documents\");\n\t\t\t}\n\t\t}\n\t\tcatch (Exception e) {\n\t\t\tlogger.error(\"Failed to delete documents\", e);\n\t\t}\n\t}\n\n\t@Override\n\tprotected void doDelete(Filter.Expression filterExpression) {\n\t\tAssert.notNull(filterExpression, \"Filter expression must not be null\");\n\n\t\ttry {\n\t\t\tString filterStr = this.filterExpressionConverter.convertExpression(filterExpression);\n\t\t\tDeleteDocumentsParameters deleteDocumentsParameters = new DeleteDocumentsParameters();\n\t\t\tdeleteDocumentsParameters.filterBy(filterStr);\n\n\t\t\tMap<String, Object> response = this.client.collections(this.collectionName)\n\t\t\t\t.documents()","sourceCodeStart":173,"sourceCodeEnd":209,"githubUrl":"https://github.com/spring-projects/spring-ai/blob/98a7beda4f29d80a71c5837eb4053b03a93a46f7/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java#L173-L209","documentation":"TypesenseVectorStore.doDelete(List<String>) deletes documents by query and compares num_deleted with idList.size(); if fewer were deleted it warns 'Failed to delete all documents'. Typesense deletes by a filter query built from the ids, so a mismatch means some ids were not found or the delete filter didn't match. Exceptions are logged at ERROR and swallowed.","triggerScenarios":"vectorStore.delete(List.of(id)) where Typesense's documents().delete returns num_deleted < id count — ids absent, already deleted, or not matching the generated filter; any thrown exception also logs 'Failed to delete documents'.","commonSituations":"Deleting stale ids after a re-index; collectionName mismatch; Typesense server connectivity issues (caught exception path); special characters in ids breaking the delete filter.","solutions":["Verify the ids exist in the Typesense collection (documents().search by id) before deleting","Check the collectionName configuration matches where documents were written","Inspect the logged exception (if any) for connectivity/auth problems with the Typesense server","Escape/normalize ids used in the delete filter query"],"exampleFix":"// before\ntypesenseVectorStore.delete(ids); // partial deletes only warned\n\n// after\nList<Document> existing = typesenseVectorStore.similaritySearchByIds(ids); // or verify per id\ntypesenseVectorStore.delete(ids);\nlogger.info(\"deleted request size=\" + ids.size());","handlingStrategy":"validation","validationCode":"// confirm ids exist in Typesense before delete\n// use the Typesense client to retrieve each document and skip missing ids","typeGuard":null,"tryCatchPattern":"try {\n    typesenseVectorStore.delete(ids);\n} catch (Exception e) {\n    logger.error(\"Typesense delete failed (check ERROR log 'Failed to delete documents')\", e);\n}","preventionTips":["Confirm collectionName matches the write path","Treat partial deletes as expected for stale ids","Check Typesense server health and API key before bulk deletes","Escape ids used in delete filter queries"],"tags":["typesense","delete","partial-delete","vector-store"],"backgroundTag":"record-not-found","analyzedSha":"98a7beda4f29d80a71c5837eb4053b03a93a46f7","analyzedAt":"2026-09-11T14:15:49.441Z","contentChangedAt":"2026-09-11T14:15:49.441Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}