{"record":{"id":"a7ab53b16cc4ecab","repo":"chroma-core/chroma","slug":"search-is-not-implemented-for-local-chroma","errorCode":null,"errorMessage":"Search is not implemented for Local Chroma","messagePattern":"Search is not implemented for Local Chroma","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"chromadb/api/rust.py","lineNumber":393,"sourceCode":"    @override\n    def _get_indexing_status(\n        self,\n        collection_id: UUID,\n        tenant: str = DEFAULT_TENANT,\n        database: str = DEFAULT_DATABASE,\n    ) -> \"IndexingStatus\":\n        raise NotImplementedError(\"Indexing status is not implemented for Local Chroma\")\n\n    @override\n    def _search(\n        self,\n        collection_id: UUID,\n        searches: List[Search],\n        tenant: str = DEFAULT_TENANT,\n        database: str = DEFAULT_DATABASE,\n        read_level: ReadLevel = ReadLevel.INDEX_AND_WAL,\n    ) -> SearchResult:\n        raise NotImplementedError(\"Search is not implemented for Local Chroma\")\n\n    @override\n    def _count(\n        self,\n        collection_id: UUID,\n        tenant: str = DEFAULT_TENANT,\n        database: str = DEFAULT_DATABASE,\n        read_level: ReadLevel = ReadLevel.INDEX_AND_WAL,\n    ) -> int:\n        return self.bindings.count(str(collection_id), tenant, database)\n\n    @override\n    def _peek(\n        self,\n        collection_id: UUID,\n        n: int = 10,\n        tenant: str = DEFAULT_TENANT,\n        database: str = DEFAULT_DATABASE,","sourceCodeStart":375,"sourceCodeEnd":411,"githubUrl":"https://github.com/chroma-core/chroma/blob/aecdd12c8a891610db8653630b066b32ceb678b5/chromadb/api/rust.py#L375-L411","documentation":"RustBindingsAPI._search (chromadb/api/rust.py:393) is a stub that raises NotImplementedError. The multi-query Search API (Collection.search(searches=[...])) is implemented server-side only; the embedded Rust bindings expose just the classic query/get paths, so _search always fails in this mode.","triggerScenarios":"client = chromadb.RustClient(...); client.get_collection('docs').search([Search(query=['a'], n_results=10), ...]). Any Collection.search() (multi-search batch) call routed to the Rust bindings backend.","commonSituations":"Migrating a server-based workload (which used batched search) to the embedded Rust client for local testing; feature-flag experiments enabled in environments where the backend does not support them.","solutions":["Run the workload against a Chroma server via chromadb.HttpClient, which implements the search endpoint","Replace batched search with individual collection.query(...) calls, which the Rust bindings do support","Gate the .search() code path on the client backend (server vs embedded) at startup"],"exampleFix":"# before (raises NotImplementedError on Rust bindings)\nresults = collection.search([Search(query=['gravity'], n_results=5)])\n\n# after - use query(), supported everywhere\nresults = collection.query(query_texts=['gravity'], n_results=5)","handlingStrategy":"fallback","validationCode":"def supports_search(client) -> bool:\n    \"\"\"Multi-query .search() is server-only.\"\"\"\n    return type(client._server).__module__.startswith('chromadb.api.fastapi')","typeGuard":null,"tryCatchPattern":"try:\n    results = collection.search(searches)\nexcept NotImplementedError:\n    # embedded: fall back to per-query collection.query()\n    results = [collection.query(query_texts=s.query, n_results=s.n_results) for s in searches]","preventionTips":["Prefer collection.query() in code that must run embedded and server-side alike","Gate .search() batches behind a server-mode feature flag","Test the embedded path in CI so server-only calls cannot silently creep into shared code"],"tags":["chroma","embedded-mode","rust-bindings","search","not-implemented"],"backgroundTag":"feature-unsupported-in-embedded-mode","analyzedSha":"aecdd12c8a891610db8653630b066b32ceb678b5","analyzedAt":"2026-08-16T21:53:27.228Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}