Exofind
Delightful search built on object storage
docker run -d --name exofind -p 8080:8080 \ -v exofind-data:/data \ -e EXOFIND_AUTH_ROOT_KEY=exok_quickstart \ ghcr.io/levelfourab/exofind:main-latestPUT /v1alpha1/admin/indexes/booksAuthorization: Bearer exok_quickstartContent-Type: application/json
{ "fields": { "id": { "type": "string", "primaryKey": true, "required": true }, "title": { "type": "string", "matching": { "typoTolerance": {} }, "sort": {} }, "category": { "type": "string", "filter": {}, "facet": {} }, "published": { "type": "boolean", "filter": {} } }}POST /v1alpha1/indexes/books/searchAuthorization: Bearer exok_quickstartContent-Type: application/json
{ "query": [ { "type": "text", "text": "silent spr" }, { "field": "published", "match": { "value": true } } ], "limit": 20}What it does
Object storage is the source of truth
Wipe a node and it pulls the index back from the bucket. Nodes coordinate with conditional writes, without Raft or cluster coordinators.
Search powered by Lucene
Full-text matching with typo tolerance, prefix autocomplete, geospatial filters, nested sub-documents, and k-nearest neighbors (KNN) vector search.
Per-value language analysis
Documents carry their language tag. The engine applies CJK segmentation, stemming, and Scandinavian compound splitting automatically without custom pipeline setup.
Declarative schemas and index generations
Send the schema you want with a PUT request. When a change requires a reindex, Exofind builds a new generation in the background and promotes it while queries continue.
Shared keys without a database
API keys are stored in the bucket. A key created on one node propagates to all nodes within seconds, scoped by permissions and index patterns.
Interchangeable stateless nodes
Read nodes never talk to each other. Nodes answer every query from local disk and scale horizontally behind standard load balancers.
See it searching
Each demo searches a real dataset through a node, and exists to show one thing the engine can do.
Swedish food search
Open demo2 606 foods from Livsmedelsverket, the Swedish Food Agency. Shows compounding splitting of words, type sås and the results include gravlaxsås.
- compound splitting
- facet counts that ignore their own filter
- range buckets
- highlighting
Airport type-ahead
Open demoEvery airport with an IATA code, from OurAirports. Type sto and Stockholm appears at once. Type the typo stockhlm and Stockholm is still there.
- typo tolerance
- prefix matchers
- per-field weights
- distance filters and sorts
Cleveland Museum of Art
Open demo30 000 objects from the open access collection with a rich ability to filter them.
- facet counts that ignore their own filter
- range buckets
- ordering
- numbered pages and cursors
- highlighting
Record shop
Open demo300 000 records from Discogs, and every pressing of them.
- sub-documents
- facets and ordering inside a value
- matched values
- prices and values read out of the search box
Where to go
Who is behind this
Exofind is built by Level Four AB. The engine is open source under the Apache License 2.0, and you can run it without us.
We also work with the teams that use it: index design, deployment on your own object storage, and tuning relevance. Tell us what you are building at hello@levelfour.se.
Exofind is built by Level Four AB and is available under the Apache License 2.0.