Repository navigation
Releases: LevelFourAB/exofind
Releases · LevelFourAB/exofind
Release list
v0.6.0
0.6.0 (2026-10-04)
Features
- Allow fallback fields when sorting (2a8fcd8)
Bug fixes
- Answer 400 instead of 500 for a distance-sort cursor that holds no distance (e9138a9)
- Answer 400 instead of 500 for a key expiry later than a key can store (31afff2)
- Answer 400 instead of 500 when a string value is too long to index (7035e66)
- Answer 400 instead of 500 when a text or boolean field gets the wrong JSON type (a08deca)
- Answer 404 instead of restoring search settings deleted during a PUT with If-Match: * (b086567)
- Answer index:unsupported instead of a 400 when the live generation needs a newer engine (bc80dca)
- Close an index that was still opening when it was deleted (9a8d4e0)
- Continue paging when a cursor comes from a larger index instead of answering 500 (b436821)
- Count requests that match no route as UNKNOWN instead of by their path (209933a)
- Delete an index created on another node without a false 404 (fb5e3e0)
- Keep a recreated index's objects when an old removal sweep runs at the same time (3499ef1)
- Keep acknowledged writes when an index is handed over after a failed push (1497bc9)
- Keep indexes readable when two nodes push after the manifest was removed (2fcd6ef)
- Keep keys and permissions from newer versions when an older node changes the keys (54b92fd)
- Keep pulling an index after a pull fails with an unexpected error (c6130a5)
- Keep ranking from using a signal that an update removed (8c8f7ff)
- Keep the index tie breaker when a fallback sort starts on the same field (25e681b)
- Keep the removal mark of an index deleted while another node creates it (8301b59)
- Keep writes a node takes during a quick lose-and-regain of an index (d27cca6)
- Refuse a cursor sent with another locale instead of skipping or repeating hits (8866fe9)
- Refuse a JSON body that holds more than one value (3f17008)
- Refuse a primary key of the wrong JSON type (36eab99)
- Refuse a request that gives the same JSON property twice instead of keeping the last value (84e8283)
- Refuse a zero knn vector on a cosine field instead of scoring every hit NaN (e5004c0)
- Refuse an unencoded ; in request paths (4d3f85b)
- Refuse definition changes that move a field name onto a wildcard field that indexes it differently (a315000)
- Refuse definition changes that would block every later write of an indexed field (9bb85a2)
- Refuse key index patterns that no index name can match (f033ee6)
- Refuse to promote or delete a generation of an index that needs a newer engine (5dc8b99)
- Report removed field locales as an incompatible definition change (0c02be8)
- Restore the remote definition and change log when a pull follows a refused push (c3c666f)
- Skip an NDJSON line that is valid JSON but not an object instead of failing the batch (895ab1e)
- Stop a concurrent partial update from bringing back documents a delete by query removed (a9f4cc7)
- Stop a freshness wait from timing out when the index is promoted mid-wait (13d90c2)
- Stop a key granted one generation from cancelling the reindex of another (e91a293)
- Stop a late key refresh from bringing a revoked key back (5bcf276)
- Stop a node that lost an index from keeping the documents it gave up (d7e8e8a)
- Stop a promoted reindex from keeping signals the source index removed (b1017c7)
- Stop answering with old search settings after a revert or a second removal (3375425)
- Stop deeply nested definitions from turning empty after the index reopens (c6582b6)
- Stop deleting newer indexes after you restore an older registry in local mode (f39a138)
- Stop keys granted only an index's generations from changing its search settings (c238a88)
- Stop locale patches from leaving stale values in the default locale (ff0d713)
- Stop pushing a handed-over index when its claim is taken during the handover (de40f93)
- Stop readers from serving a deleted index after it is created again under the same name (4face53)
- Stop reads from answering from a demoted generation after a roll back (a15fdf5)
- Stop the refresh pass from removing an index created while it ran (0179b1d)
- Treat -0.0 as 0.0 in float and double fields so filters and facets agree at zero (702d783)
- Warn when EXOFIND_NODE_ADDRESS has no scheme or an invalid host name (30ecc6e)
v0.5.0
0.5.0 (2026-09-15)
Features
- Allow large chunked streaming to batch endpoints (5384ed7)
- Index a single document by its key (a9ab104)
- Look up one document by its key over the API (0029295)
- Support for freshness tokens to be able to request up to date searches (17e3474)
- Unify and document change path selection for documents and index settings (85dfd8d)
v0.4.1
v0.4.0
0.4.0 (2026-09-13)
Features
- Allow keys to be rotated and protect against accidental removals of last key (5a850df)
- Answer 304 when a GET carries an ETag and the resource is unchanged (3517e54)
- Answer every failed request with a standard JSON error body (96bb3f3)
- Filter and page the index, key and reindex listings (a9b9080)
- Generate real query and field types in OpenAPI clients (6104987)
- Improve batch indexing error handling and allow skipping docs with errors (f626075)
- Introduce shared cache settings for the entire node (983b10a)
- Let a deployment cap how many facet values and suggestions a request may ask for (012c483)
- Measure facet value and explain requests (dcedc22)
- Normalize error codes for numeric ranges (7d9f1e7)
- Publish a named Interpret union in the OpenAPI document (7f8acf7)
- Read and cancel a reindex job under /admin/reindexes (00ff93d)
- Reindex jobs are now identifiable and carry more metadata (e9bbf70)
- Rename every error code by family, request part and defect (fd4cb1a)
- Rename index:not-found to index:not_found (045382b)
- Rename some request:update errors to index:update (67774a4)
- Rename the live generation
liveGenerationwhen listing indexes (493d02f) - Report enums in the REST API as lowercase (2c1ac3c)
- Report every error path in the REST API using dotted form (4af6fd5)
- Report which index generation answered a search (51663ce)
- Require all parameter to delete all documents (21d1e36)
- Require indexes.promote permission when auto-promoting reindex (eeb47ec)
- Return missing primary keys as text (561faac)
- Return the index with its ETag from commit and pull (068f6cb)
- Stronger If-Match application in the REST API (3be9a94)
- Support for ranking signals with non-indexing updates (402b301)
Bug fixes
- Accept a document key written as another JSON type in a PATCH body (4a6e2f4)
- Answer index:not_found when trying to reindex a non-existent index (1980fbe)
- Avoid sending back empty tieBreakers for rankings (53c6755)
- Cancel a queued reindex without a 15 second wait (b062e1a)
- Count the clauses of interpret targets against the search clause caps (a68d202)
- Ignore paging, sort and rescore in explain instead of validating them (8c89ca4)
- Index documents forwarded over HTTP/2 instead of reporting zero indexed (6933dbc)
- Keep a closing index copy from overwriting files (64051b3)
- Keep a registry repair from undoing a delete that lands while it runs (993f066)
- Keep a rescored search from paging into an empty page (33328ae)
- Keep a slow registry read from hiding an index another thread just created (1036215)
- Keep attempting to push indexes if a push fails (830c102)
- Keep registry entries a newer node wrote when an older node changes it (87ff74e)
- Keep the definition and change log intact when a node stops mid-write (7ce5358)
- Mark storage as removed when a delete cannot clear a local copy (6cf9dbf)
- Refuse a boost weight of NaN or Infinity instead of scoring with it (3204515)
- Report NDJSON document errors without a
documentsprefix (f314c49) - REST API now answers more calls with 4xx instead of 500 (2f9aad7)
- Return 400 for an invalid after parameter when reading documents (b4edb2e)
- Stop a refused reindex from leaving an empty generation behind (b2f2008)
- Stop omitting score from a search ranked by signals or a second pass (9812afd)
- Tell apart an empty
matchedand a blank field name, and point highlight errors at the field (9a44f8b)
Performance
v0.3.0
0.3.0 (2026-09-10)
Features
- Keep replaced index files in the bucket for a grace period before deleting them (7e361b4)
- Sweep orphaned objects from an open index on a timer (c29cce1)
- User queries can now match any of the words instead of all words (d4e5806)
Bug fixes
- A failover no longer loses recently written documents (c003f23)
- A lost index registry no longer deletes the indexes on a node (ae3d9b6)
- A push conflict no longer loses the documents written around it (4569113)
- Handle stale generations in Google Cloud Storage without getting stuck (7069e87)
- Keep writes made during a reindex instead of dropping them at the promote (b2c43b6)
- Pulled files that do not match the manifest are rejected instead of used (a602fe8)
- Recreating a deleted index no longer brings the old documents back (3f6a698)
- Stop a definition update from emptying an index when taking over indexing for it (37f04a8)
- Stop a failed push from handing an index over without its writes (efda453)
- Stop a rejoining node from deleting an index from storage (6eef1f7)
- Vanished manifests no longer makes readers drop their index files (f3ecdf6)
Documentation
- Add cross-links and related sections for new pages (50eec3a)
- Add search powered by project to website (b2aaab3)
- Add storage layout, glossary, write guarantees, testing and ranking pages (6018451)
- Improve example copy and relevance (38002ea)
- Limit snippets in the website search (233e2ac)
- Loading states for examples (a0a1593)
- Reset scroll when typing into the website search (3a1fd6e)
- Stop the loading bar sticking after pressing Back from a demo (66230b8)