返回项目目录
xerj-org

xerj-org

xerj

XERJ is the new way for AI to search data. Its autoindex capability activates agents to know your data without the token waste of grep and sed. One command indexes code, docs, logs and PDFs for search, RAG, security audits and agent memory, using 40x fewer tokens than grep. Elasticsearch compatible, so existing clients just work.

AgentRAG评测 / 安全ai-searchai-search-algorithmsai-search-engineai-search-freeai-search-moduleai-search-optimization
Stars
1402
Forks
287
Watchers
1402
Issues
47

README

项目介绍

14242 bytes

XERJ

XERJ is a search engine for AI agents. Point it at a folder and one command makes your code, docs, logs and PDFs queryable, so an agent asks questions instead of reading files into its context window.

CI License: Apache-2.0 Release ES conformance

Paste this to your AI agent

The whole setup is one prompt:

Install XERJ (docs: https://xerj.org/llms.txt), index this project's sources, and set up
reference coding: clone and index the open-source repos closest to what we're building,
and search how they solved a problem before writing code.

llms.txt gives your agent the ordered steps: install, start the server, xerj autoindex ., query with any Elasticsearch client, and the reference-coding loop (clone similar OSS, index it, retrieve the mechanism before writing, cite what you use, respect licenses).

Why you would: an agent working from memory retry-loops on any API it hasn't memorised, and grep only tells it where to look — the recovery is still reading source into context, up to 1.06M input tokens on one corpus in our measurements. An agent that queries XERJ reads the exact passage instead.

The numbers, measured end-to-end on code the model had not memorised (the case study, 8 tasks across 4 languages, 16 runs per arm, real claude -p token counts): 2.7× fewer output tokens than grep-driven Claude Code (9,982 vs 26,477) at the same 16/16 solve rate, 26× fewer than working from memory alone (260,916 → 9,982), and 2.1× cheaper ($1.58 vs $3.27). In a companion run on a Rust library the model had never seen: 9/9 correct with retrieval versus 0/9 from memory. Beyond the lab, users report roughly 5× fewer tokens across real product development — fewer retry loops, sharper requests (field reports).

More prompts that work on a fresh install:

  • "Read https://xerj.org/llms.txt, set XERJ up as your search backend, index ./docs, and show me one example query per index it created."
  • "Run xerj autoindex map and tell me what is in this data — types, counts and the gotchas it recorded — then answer my questions with search instead of reading files."
  • "Use XERJ's /_memory/notes API as your long-term memory for this project: store what you learn as you work, and recall it by meaning next session."

Worked, validated examples for each capability: xerj.org/docs/recipes.

Watch the XERJ demo: boot, ingest, search, vectors, dashboards

Boot, bulk ingest, search, vector kNN, live dashboards, no cuts. Watch it on xerj.org or try the live playground.

Install by hand

curl -fsSL https://xerj.org/get | sh

Windows PowerShell:

irm https://xerj.org/get.ps1 | iex

One static binary, no JVM, no dependencies. Prebuilt for Linux, macOS and Windows on x86-64 and arm64. You can also build from source. It speaks the Elasticsearch API, so existing clients, dashboards and tooling work against it unchanged.

First commands after install (the installer prints where xerj landed — add it to your PATH if needed): xerj --insecure --data-dir ./data &, wait until http://localhost:9200 responds, then xerj autoindex ~/my-project — see Index a folder.

Index a folder

Start the server, then point autoindex at anything:

xerj --insecure --data-dir ./data &     # local dev: no TLS, no auth
xerj autoindex ~/my-project

If your server has auth on — which is the default for every start without --insecure, including any start from a config file — hand autoindex the same key. It never picks the key up from xerj.toml; pass --api-key or set XERJ_API_KEY, or every request comes back 401 Unauthorized:

xerj --data-dir ./data &                          # auth on: key minted on first boot
export XERJ_API_KEY="$(cat ./data/admin.key)"     # <data_dir>/admin.key
xerj autoindex ~/my-project

That is the whole setup. There is no schema to write and no pipeline to configure. XERJ sniffs each file, works out what it is, and creates one index per dataset it finds:

phase A: 593 datasets inferred, 1955 junk/skipped files
phase B: indexing 25329 files with 8 workers
done in 158.1s, 593 datasets, 83103 records live, 790 junk records

Source files go through tree-sitter, so code arrives with its symbols and line numbers instead of as flat text. CSV, JSON, JSONL, XML, YAML, SQLite, PDF, DOCX, HTML and common log formats are all handled. Unity projects get first-class treatment: text-serialized scenes, prefabs and assets become one record per GameObject/Component, .meta files become a GUID↔path table, and MonoBehaviour records carry script_class/script_path so "which scenes use this script?" is a single query (binary-serialized assets need Force Text to be readable; generated dirs like Library/ are auto-skipped and recorded).

Search it

This is the Elasticsearch API, so you already know this part:

# what did it find?
curl localhost:9200/_cat/indices

# full-text
curl "localhost:9200/ax-*/_search?q=checkout+error"

# structured
curl localhost:9200/ax-orders/_search -H 'content-type: application/json' -d '{
  "query": { "range": { "total": { "gte": 100 } } },
  "aggs":  { "by_status": { "terms": { "field": "status" } } }
}'

Vector and hybrid search use the same knn and semantic syntax you would send to Elasticsearch. Any Elasticsearch client library works if you point it at localhost:9200.

Connect an agent over MCP

Not every agent can run a shell command. Desktop assistants and function-calling hosts reach tools through the Model Context Protocol, and the binary you just installed is the MCP server — there is nothing else to download and nothing to compile:

xerj --insecure --data-dir ./data &     # 1. the node the tools query
xerj mcp                                # 2. MCP stdio server (your client runs this)

xerj mcp speaks MCP over stdio and proxies to the node named by XERJ_URL (default http://localhost:9200). It does not start a node — step 1 is the prerequisite. Drop this into your MCP client's config:

{
  "mcpServers": {
    "xerj": {
      "command": "/home/you/.local/bin/xerj",
      "args": ["mcp"],
      "env": { "XERJ_URL": "http://localhost:9200" }
    }
  }
}

Use an absolute path — the installer puts xerj in ~/.local/bin by default (command -v xerj confirms), and MCP hosts launched from a desktop icon do not inherit your shell's PATH. If the node is running with auth (anything but --insecure), add "XERJ_AUTH": "ApiKey <key>" alongside XERJ_URL; the key is in <data-dir>/admin.key.

Ten tools are exposed, each a thin proxy over an endpoint XERJ already serves:

Tool What it does
xerj_search ES query-DSL search over an index
xerj_semantic_search recall by meaning over a semantic_text field — the query is embedded server-side (default embedder is lexical feature-hashing, not neural, unless the node runs --embed-mode neural)
xerj_vector_search kNN over a dense_vector field
xerj_hybrid_search RRF or linear fusion of sub-queries
xerj_memory_store / xerj_memory_recall durable agent memory in a namespace, recalled by text, meaning or vector
xerj_brain_overview / xerj_brain_ego / xerj_brain_link / xerj_brain_unlink the second-brain link index — orient, expand one node's evidence-backed neighborhood, assert and retire links

xerj mcp --help prints the same config block and the full option list. The machine-readable tool schemas are published at xerj.org/docs/agents/schemas/mcp-tools.json — generated from a live tools/list, never hand-written, and gated in CI (scripts/mcp-schema-check.sh) plus a unit test, so the published list cannot drift from the served one.

Why it exists

Agents burn their context window reading files. The PHP in WordPress core is about 5.2 million tokens, or 26 full context windows, so an agent cannot simply read it. Grep does not solve this either, because a grep hit is a line and judging that line means opening the whole file.

Querying an index costs kilobytes per question instead. In an AI security audit of WordPress core, an agent worked across 1,492 PHP files on roughly 26,000 tokens, which is what it takes to load about half a percent of the tree.

Use cases

Runnable examples live in recipes/ and docs/examples/.

Elasticsearch compatibility

XERJ implements the Elasticsearch REST API: indices, documents, bulk, search, aggregations, mappings, kNN, scroll, reindex and the _cat endpoints. Kibana and the official client libraries connect to it directly. One boundary worth knowing before you point export tooling at it: scroll is a bounded up-front snapshot, not a segment-walking cursor, so a query whose exact total exceeds the snapshot window is refused with a 400 rather than silently truncated — use search_after for result sets of any size (the cap).

The conformance suite runs on every commit and currently passes 1366 of 1369 cases. It lives in engine/tests/es-compat-yaml, and the remaining gaps are listed there rather than hidden. XERJ is compatible with the API. It is not a reimplementation of Elasticsearch internals, and it is not a fork.

Benchmarks

XERJ is benchmarked head to head against Elasticsearch 8.13.4 across ingest, full-text search, aggregations, vector search, and reads issued under a concurrent write flood. The latest closed-loop run scores 55 wins, 26 ties, 4 losses, including 1.72x ingest throughput and a 1.61x smaller on-disk footprint.

All four losses are the same gap: read p99 while a high-rate writer runs. It is written up in full rather than left out. Results, methodology and the harness are at xerj.org/benchmarks and in demo/playbooks, so you can rerun them yourself. Treat any number you cannot reproduce with skepticism, including ours.

Build from source

You need a stable Rust toolchain.

git clone https://github.com/xerj-org/xerj
cd xerj/engine
cargo build --release -p xerj-server
./target/release/xerj --insecure --data-dir ./data

To run the conformance suite against a running server:

cargo run --release -p es-yaml-runner -- --dir tests/es-compat-yaml/yaml

Documentation

Reference pages for individual subsystems, written against the source and including the limits each one does not lift:

  • Second brain for the relationship layer over indexed documents: the /_graph routes, evidence on links, the eight detectors and the two-hop cap.
  • Scripting for the Painless subset, where scripts run, and the resource limits that bound them.
  • Snapshot and restore for the supported subset of the snapshot API, and what restore replaces.
  • Security model for authentication, the reserved .xerj-memory-* namespace, API keys and what is not enforced.

Contributing

Pull requests are welcome. See CONTRIBUTING.md for the workflow and CLA.md for the contributor licence agreement, which is one signature per contributor rather than one per pull request.

Bugs and feature requests go to GitHub issues.

License

Apache 2.0.