Quickstart
Run Lucenia, index some documents, and search them. About five minutes, one dependency, no cluster to provision and nobody to email first.
You need Docker. Nothing else — no account to create and no Java to install first.
A new node runs for 14 days without a license, so you can get to a result before deciding whether to go further. Nothing on this page asks you to register. See Trial license for what happens after that.
1. Start Lucenia
One command. There is no file to write first.
docker run -d --name lucenia -p 9200:9200 \
-e discovery.type=single-node \
-e LUCENIA_INITIAL_ADMIN_PASSWORD=QuickStart_2026! \
lucenia/lucenia:0.13.0
That is the whole installation. Nothing to provision and nothing to size.
Give it a few seconds, then check that it is up. Security is on by default, so this is HTTPS with a self-signed certificate — -k tells curl not to mind:
curl -k -u admin:QuickStart_2026! https://localhost:9200
{
"name" : "lucenia",
"cluster_name" : "lucenia-quickstart",
"version" : { "number" : "0.13.0", "distribution" : "skylite" },
"tagline" : "[SEARCH]...on your terms"
}
Use a different LUCENIA_INITIAL_ADMIN_PASSWORD if you like — it has to pass a strength check, so keep the mix of cases, a digit and a symbol.
2. Index some documents
curl -k -u admin:QuickStart_2026! -X POST "https://localhost:9200/_bulk?refresh=true" \
-H "Content-Type: application/x-ndjson" -d '
{"index":{"_index":"articles","_id":"1"}}
{"title":"Cardioselective agents in post-infarction management","year":2024}
{"index":{"_index":"articles","_id":"2"}}
{"title":"Once-daily dosing and adherence in hypertension","year":2023}
{"index":{"_index":"articles","_id":"3"}}
{"title":"Peripheral oedema in long-term calcium channel therapy","year":2025}
'
3. Search them
curl -k -u admin:QuickStart_2026! "https://localhost:9200/articles/_search?pretty" \
-H "Content-Type: application/json" -d '
{
"query": { "match": { "title": "dosing adherence" } }
}'
Document 2 comes back first. That is a working search engine, four minutes in.
4. Now something a plain search engine will not do
Lucenia can strip sensitive data out of documents before they are indexed, so regulated values never land in an index in the clear. No model, no external service, and no configuration beyond naming a profile.
Create a pipeline:
curl -k -u admin:QuickStart_2026! -X PUT "https://localhost:9200/_ingest/pipeline/redact" \
-H "Content-Type: application/json" -d '
{
"processors": [ { "compliance": { "profile": "hipaa", "fields": ["notes"] } } ]
}'
Push a document through it:
curl -k -u admin:QuickStart_2026! -X POST "https://localhost:9200/_ingest/pipeline/redact/_simulate?pretty" \
-H "Content-Type: application/json" -d '
{
"docs": [
{ "_source": { "notes": "Patient SSN 123-45-6789, contact jane@example.com, DOB 1980-02-14." } }
]
}'
The simulated document comes back redacted, with a record of what was found. Inside the response's
docs[0].doc._source:
{
"notes": "Patient SSN <US_SSN>, contact <EMAIL_ADDRESS>, DOB <DATE_OF_BIRTH>.",
"_compliance": {
"profile": "hipaa",
"total": 3,
"redacted": true,
"counts": { "us_ssn": 1, "email_address": 1, "date_of_birth": 1 }
}
}
Three identifiers detected and replaced. That ran inside your cluster — nothing was sent anywhere.
5. Connect from your app
curl proved the cluster works. Here is the same search — dosing adherence against the articles
index you built in step 2 — from application code. Document 2 comes back, exactly as it did above.
- Python
- JavaScript
- Java
pip install lucenia-py
from lucenia import Lucenia
client = Lucenia(
hosts=[{"host": "localhost", "port": 9200}],
http_auth=("admin", "QuickStart_2026!"),
use_ssl=True,
verify_certs=False,
ssl_show_warn=False,
)
response = client.search(
index="articles",
body={"query": {"match": {"title": "dosing adherence"}}},
)
for hit in response["hits"]["hits"]:
print(f"[{hit['_id']}] {hit['_source']['title']}")
npm install @lucenia/client
Save as search.mjs and run it with node search.mjs:
import { Client } from '@lucenia/client';
const client = new Client({
node: 'https://localhost:9200',
auth: { username: 'admin', password: 'QuickStart_2026!' },
ssl: { rejectUnauthorized: false },
});
const response = await client.search({
index: 'articles',
body: { query: { match: { title: 'dosing adherence' } } },
});
for (const hit of response.body.hits.hits) {
console.log(`[${hit._id}] ${hit._source.title}`);
}
<dependency>
<groupId>io.lucenia.client</groupId>
<artifactId>lucenia-java</artifactId>
<version>0.12.1</version>
</dependency>
Java needs a configured transport before it can issue a request, which is about 25 lines and is
covered under Java client. With a client built there, and an
Article POJO holding title and year:
SearchResponse<Article> response = client.search(
s -> s.index("articles")
.query(q -> q.match(m -> m.field("title").query(FieldValue.of("dosing adherence")))),
Article.class);
for (var hit : response.hits().hits()) {
System.out.printf("[%s] %s%n", hit.id(), hit.source().getTitle());
}
These snippets disable TLS verification, because the container generates its own certificate. That is fine against a throwaway local cluster and wrong everywhere else — each client page shows how to pass a CA bundle instead.
Hard-coding the password is likewise a quickstart shortcut. Read it from the environment before this becomes anything you keep.
Where to go next
| You want to | Read |
|---|---|
| Connect from code — Python, JavaScript or Java | Language clients |
| Search by meaning rather than by keyword | Search by meaning |
| Extract, chunk and embed documents on the way in | Content processing |
| Give an agent durable memory | Inference memory |
| Work with locations, shapes and road networks | Geospatial |
| Redact and govern data properly | Compliance processor |
| Run this for real | Install and configure |
Running it somewhere other than Docker
This page uses Docker because it is the shortest path to a running query. For anything you intend to keep:
- Kubernetes with Helm
- Tarball
- Windows
- Docker in more detail — multi-node, custom certificates, production settings
Stopping
docker stop lucenia # keep everything; `docker start lucenia` resumes
docker rm -f lucenia # discard the container and its data
docker rm discards the data along with the container. Each node records its 14-day evaluation period alongside its data, so removing it starts a fresh cluster — and a fresh 14 days.