Skip to content

Full-spectrum search.
Built to be the fastest.

Full-text, vector, and faceted search with analytics, from one open source engine. Start with curl and plain JSON. Native code that gets more from every core and every gigabyte.

POST /collections/books/_search
{
"query": "title:winter",
"sort": "year",
"fields": ["title", "author", "year"]
}
response
{
"docs": [
{"title": "Winter's Heart",
"author": "Robert Jordan", "year": 2000},
{"title": "Winter",
"author": "Marissa Meyer", "year": 2015},
{"title": "The Winds of Winter",
"author": "George R. R. Martin"}
]
}

Designed for the most search per core, per gigabyte, and per dollar. In the cloud, you pay for inefficiency forever. Luxir is built to make every core, byte, and cycle count.

Every core

A work-stealing scheduler shares indexing, merging, and query execution across all cores. Network IO is asynchronous, so a slow client never holds a core.

Every gigabyte

Native code, no garbage collector, no heap ceiling. Segments are immutable and memory-mapped, read straight from the page cache.

Every cycle

Postings decoding, scoring, and vector distance run on SIMD paths, and top-k requests prune with block-max bounds whenever the request allows it.

Luxir is designed to scale up first

One large cloud instance costs roughly the same per core as several small ones, without the cross-node coordination overhead. Luxir is built to put that whole machine to work. The architecture overview explains how.

Three commands from nothing to a working search.

  1. Start the server

    Download it and run it. The HTTP/JSON API is on port 9400; add a data directory to keep data across restarts.

    ./luxir
  2. Index documents

    One JSON document per line, as many as you like. Field types come from the name: title_t is full text, author_name supports word search plus whole-name facets and sorting, year_i is an integer. The collection appears on first write.

    curl localhost:9400/collections/books/_update?commit=true \
    -H 'Content-Type: application/x-ndjson' -d '
    {"id":"1","title_t":"Dune","author_name":"Frank Herbert","year_i":1965}
    {"id":"2","title_t":"Dune Messiah","author_name":"Frank Herbert","year_i":1969}
    {"id":"3","title_t":"Children of Dune","author_name":"Frank Herbert","year_i":1976}'
  3. Search

    Write queries in the Luxir query language or as structured JSON.

    curl 'localhost:9400/collections/books/_search?pretty' \
    -d '{"query": "author_name:herbert AND year_i:<1970"}'
    {"docs": [
    {"id": "1", "author_name": "Frank Herbert", "title_t": "Dune", "year_i": 1965},
    {"id": "2", "author_name": "Frank Herbert", "title_t": "Dune Messiah", "year_i": 1969}
    ]}

Search, facets, and analytics in one request

Section titled “Search, facets, and analytics in one request”

Hang facets and metrics off any query and they run in the same pass over the same index view. One round trip returns the top documents, the counts for the sidebar, and the number for the header.

request
{
"query": "title_t:dune",
"filter": ["stock_i:>0"],
"limit": 3,
"get_number": true,
"fields": ["id", "title_t", "price_f"],
"ops": {
"categories": {"field_facet": {"field": "category_s"}},
"average_price": "avg(price_f)"
}
}
what the application gets back
42 resultsaverage price $11.72
  1. Dune$9.99
  2. Dune Messiah$8.49
  3. Children of Dune$8.99
categories
science-fiction31
classic8
fantasy3

Fast top-k, exact counts when asked: leave out get_number and the engine prunes with block-max bounds; ask for it and the total is counted exhaustively. Facet counts are always exact by default. Faceting covers nested facets, ranges, date histograms, and top documents per bucket; Vector and hybrid search shows a fused lexical-plus-vector ranking carrying facets of its own.

Every capability composes with the others: a filter inside a vector search, a facet over a fused ranking, a geo radius under a boolean clause.

Full-text relevance

BM25 ranking with block-max pruning; phrase, fuzzy, and prefix matching; a readable query language for developers and a never-fails syntax for end-user search boxes.

Vector and hybrid

A kNN query is a query like any other. Filters apply inside the vector search rather than after it, and rank fusion combines lexical and vector sources in one request.

Facets and analytics

Field, range, and date facets with nested sub-operations and statistics over any result set. Counts are exact, never estimated.

Geo

Bounding-box and radius queries over geo points, dateline-aware, composed with everything else in the tree.

Infinite streaming

NDJSON in with no size limit and no bulk requests to chunk; documents out as one stream with no scroll state to keep alive; columnar result streams over gRPC.

JSON and gRPC, as peers

JSON concise enough to type by hand. gRPC with generated clients and streams for programs. Both are first-class; neither is a layer over the other.