Case study / Consilio

Breaking the scale
barrier

How we helped Consilio bypass the Elasticsearch performance cliff — by refusing to make it write faster.

Client
Consilio
Discipline
Search architecture · Elasticsearch · Systems performance
Engagement
Diagnostic review & re-architecture
01 The backstory

Stuck between a wall and a ceiling

In e-discovery, legal teams search, filter and tag millions of documents with absolute precision. For Consilio the hard part wasn't finding the right documents — it was permanently saving which ones got tagged Responsive, Non-Responsive or Privileged without grinding the system to a halt.

Their original setup ran update-by-query directly in Elasticsearch: over an hour to tag 500,000 documents. The workaround — storing tagged IDs in SQL and injecting them back into queries — held up for small batches, then ballooned past 100MB payloads and crashed once files scaled into the millions. ES|QL slammed into a hard 10,000-result cap with no pagination.

A slow write-performance wall on one side. A massive query payload ceiling on the other.

40 min seconds
The workflow
A query-and-update workflow that used to drag on for over forty minutes now finishes in seconds.
Zero-update architecture
02 The big idea

The great decoupling

We didn't try to force Elasticsearch to write faster. We changed the rules of the game — letting each technology do only the thing it is actually good at.

/ 01

Elasticsearch reads

One single, highly optimized index, used strictly for fast read-only searching. Nothing writes to it during a session, so nothing can slow it down.

Read-only index
/ 02

SQL remembers

A short-lived session store. The search runs once, the resulting document IDs land in SQL immediately, and the working set lives there for as long as the session does.

Session store
/ 03

Everything else follows

Pagination, sorting, filtering and tagging all happen inside SQL. No heavy write back-and-forth, no bloated query payloads, and zero performance degradation at scale.

No writes at search time
03 The diagnostic kit
Deep diagnostics
Analyzing diagnostic dumps and reviewing Consilio's custom DSL query generator, codenamed "Gauntlet."
Cluster re-sizing
Evaluating master, coordinating and data node sizes across their Kubernetes-hosted environment.
Generation indexing
Rolling data into a primary index until it hits 35GB, then automatically rolling over to a fresh index and alias to prevent oversharding.
PII offloading
Copying matched PII into tiny dedicated alphanumeric and numeric side-fields at ingestion, so heavy regex never scans a full document again.

Before we teamed up, Consilio had burned real engineering cycles on ID-injection queries and ES|QL joins. Even pushing a split-index metadata approach to its absolute limit together, we capped out at 1,698 updates per second — a massive improvement, still not enough for their real-time volumes. Rather than chase minor gains on a write-heavy design, we pivoted. Recognizing that Elasticsearch is built for reading, not rapid massive writing, was the key that unlocked the SQL-session architecture. Along the way we also killed a subtle tokenizer bug — special characters like a Unicode ellipsis in a client's last name weren't treated as whitespace, quietly vanishing valid results. Patched, and accuracy restored across the board.

04 The results

From fighting limits to not having any

1,698 docs/sec
Optimized bulk-update throughput for legacy pipelines — shrinking a 250,000-document tagging operation from an hour to about 2.5 minutes.
Zero writes at search time
The SQL-session-store architecture bypasses large-scale document writes during search entirely — removing the performance ceiling for good.

We treat every engagement as a partnership. What started as a narrow project on document tagging persistence quickly expanded into a full, top-to-bottom cluster architecture review of their Kubernetes infrastructure.

We also went beyond the original Statement of Work to run deep-dive diagnostic reviews on two of Consilio's other major products — Sightline and its successor AVR — making sure the entire product suite was set up for long-term stability.

Recommended listening
"…And Justice for All" — Metallica. Dense, complex, a marathon to get through. The right backing track for untangling millions of legal documents.
Hitting a wall your infrastructure won't scale past? Let's find the way around it.
Book a call