<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Overview on Lucille</title><link>https://kmwtechnology.github.io/lucille/docs/architecture/overview/</link><description>Recent content in Overview on Lucille</description><generator>Hugo</generator><language>en</language><atom:link href="https://kmwtechnology.github.io/lucille/docs/architecture/overview/index.xml" rel="self" type="application/rss+xml"/><item><title>The Problem of Search ETL</title><link>https://kmwtechnology.github.io/lucille/docs/architecture/overview/problem/</link><pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate><guid>https://kmwtechnology.github.io/lucille/docs/architecture/overview/problem/</guid><description>&lt;p&gt;Organizations build search applications when their users need to find information across large, heterogeneous collections of data — product catalogs, legal documents, support tickets, research papers, internal wikis, file shares. The data lives in databases, cloud storage, APIs, and content management systems, often in different formats and with varying levels of structure. Before any of it becomes searchable, it must be extracted from these sources, cleaned, enriched (with metadata, classifications, embeddings, or extracted entities), and delivered to a search engine or vector database in the right format. This process — getting source data into a search-ready state — is search ETL.&lt;/p&gt;</description></item><item><title>Parallelizing Search ETL</title><link>https://kmwtechnology.github.io/lucille/docs/architecture/overview/parallelizing-search-etl/</link><pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate><guid>https://kmwtechnology.github.io/lucille/docs/architecture/overview/parallelizing-search-etl/</guid><description>&lt;p&gt;Lucille addresses all of the pain points described in &lt;a href="https://kmwtechnology.github.io/lucille/docs/architecture/overview/problem/"&gt;The Problem of Search ETL&lt;/a&gt; — error handling, observability, pipeline composition, fan-out, configuration management, and scalability. This page focuses on the last and most fundamental of those problems: the sequential loop can&amp;rsquo;t go faster.&lt;/p&gt;
&lt;p&gt;Lucille&amp;rsquo;s answer is a parallel architecture whose components derive directly from the structure of the problem. Each of the three functions of search ETL — acquiring data, enriching it, and indexing it — becomes its own independent concurrent component, operating at its own pace, limited only by its own resources rather than by the speed of the others.&lt;/p&gt;</description></item><item><title>From Single Process to Distributed</title><link>https://kmwtechnology.github.io/lucille/docs/architecture/overview/local-vs-distributed/</link><pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate><guid>https://kmwtechnology.github.io/lucille/docs/architecture/overview/local-vs-distributed/</guid><description>&lt;p&gt;The &lt;a href="https://kmwtechnology.github.io/lucille/docs/architecture/overview/parallelizing-search-etl/"&gt;previous page&lt;/a&gt; showed how to parallelize search ingestion using three concurrent components — Connector, Workers, and Indexers — communicating through a processing queue and an indexing queue. What we have not yet discussed is what those queues actually are.&lt;/p&gt;
&lt;h3 id="what-a-queue-must-provide"&gt;What a Queue Must Provide&lt;/h3&gt;
&lt;p&gt;The queues in Lucille&amp;rsquo;s architecture have a specific set of requirements. They must support concurrent access from multiple producers and consumers. They must support a blocking &lt;code&gt;poll()&lt;/code&gt; operation so that a Worker or Indexer that finds an empty queue waits efficiently rather than spinning. And when multiple Workers are calling &lt;code&gt;poll()&lt;/code&gt; concurrently, work must be distributed fairly among them — each document should go to exactly one Worker.&lt;/p&gt;</description></item><item><title>Document Lifecycle</title><link>https://kmwtechnology.github.io/lucille/docs/architecture/overview/document-lifecycle/</link><pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate><guid>https://kmwtechnology.github.io/lucille/docs/architecture/overview/document-lifecycle/</guid><description>&lt;p&gt;This page traces a single Document from the moment it exists only as raw data in a source system to the moment it is retrievable by a search query. It takes the Lucille architecture as a given — for the conceptual explanation of how the system is structured, see &lt;a href="https://kmwtechnology.github.io/lucille/docs/architecture/overview/parallelizing-search-etl/"&gt;Parallelizing Search ETL&lt;/a&gt; and &lt;a href="https://kmwtechnology.github.io/lucille/docs/architecture/overview/local-vs-distributed/"&gt;Pluggable Queueing&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-happy-path"&gt;The Happy Path&lt;/h2&gt;
&lt;p&gt;Before a document&amp;rsquo;s lifecycle begins, the system components must be set up. A batch ingest is launched via the Runner, which first validates the configuration. Assuming a single-connector config, the Runner creates a Publisher, passes it to the Connector, and launches the Connector in its own thread. The Runner then calls &lt;code&gt;publisher.waitForCompletion()&lt;/code&gt; and blocks. In distributed mode, the Worker and Indexer processes would have been started separately beforehand. In local mode, the Runner starts the Worker and Indexer as threads in the same JVM. With this infrastructure in place, documents can begin their journey.&lt;/p&gt;</description></item><item><title>Design Rationale</title><link>https://kmwtechnology.github.io/lucille/docs/architecture/overview/design-rationale/</link><pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate><guid>https://kmwtechnology.github.io/lucille/docs/architecture/overview/design-rationale/</guid><description>&lt;p&gt;These are the overarching design decisions that shape everything about Lucille. Every architectural choice, every API design, and every operational feature must be consistent with these principles. They emerged from years of building search ingestion frameworks for customer projects and were refined through production deployments.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="part-i-guiding-principles"&gt;Part I: Guiding Principles&lt;/h2&gt;
&lt;h3 id="1-built-for-search"&gt;1. Built for search&lt;/h3&gt;
&lt;p&gt;The system should be purpose-built for getting data into search engines and vector databases — not a general-purpose ETL tool adapted for search. This focus should shape the document model, the identity model, the wire format, and the operations the system supports natively.&lt;/p&gt;</description></item></channel></rss>