<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Connectors on Lucille</title><link>https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/</link><description>Recent content in Connectors on Lucille</description><generator>Hugo</generator><language>en</language><lastBuildDate>Mon, 09 Jun 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/index.xml" rel="self" type="application/rss+xml"/><item><title>File Connector</title><link>https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/file_connector/</link><pubDate>Fri, 28 Feb 2025 00:00:00 +0000</pubDate><guid>https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/file_connector/</guid><description>&lt;p&gt;&lt;a href="https://github.com/kmwtechnology/lucille/blob/main/lucille-core/src/main/java/com/kmwllc/lucille/connector/FileConnector.java"&gt;Source Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;FileConnector&lt;/code&gt; traverses a file system and publishes a Lucille Document for each file it encounters. It supports local filesystems, Amazon S3, Azure Blob Storage, and Google Cloud Storage through a unified interface — a single connector config can traverse paths across multiple providers simultaneously. Optional File Handlers extract structured Documents from files that themselves contain data (CSV rows, JSON objects, XML elements).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="cloud-storage-configuration"&gt;Cloud Storage Configuration&lt;/h2&gt;
&lt;p&gt;When traversing cloud storage, provide authentication under the appropriate top-level config block alongside your connector config. Each provider also accepts an optional &lt;code&gt;maxNumOfPages&lt;/code&gt; to limit how many file listings are loaded into memory per request.&lt;/p&gt;</description></item><item><title>Database Connector</title><link>https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/database_connector/</link><pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate><guid>https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/database_connector/</guid><description>&lt;p&gt;&lt;a href="https://github.com/kmwtechnology/lucille/blob/main/lucille-core/src/main/java/com/kmwllc/lucille/connector/jdbc/DatabaseConnector.java"&gt;Source Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;DatabaseConnector&lt;/code&gt; reads rows from any JDBC-compatible relational database and publishes each row as a Lucille Document. Column names become field names on the Document.&lt;/p&gt;
&lt;h2 id="basic-configuration"&gt;Basic Configuration&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-hocon" data-lang="hocon"&gt;connectors: [
 {
 name: &amp;#34;db-connector&amp;#34;
 class: &amp;#34;com.kmwllc.lucille.connector.jdbc.DatabaseConnector&amp;#34;
 pipeline: &amp;#34;my-pipeline&amp;#34;

 driver: &amp;#34;org.postgresql.Driver&amp;#34;
 connectionString: &amp;#34;jdbc:postgresql://localhost:5432/mydb&amp;#34;
 jdbcUser: &amp;#34;username&amp;#34;
 jdbcPassword: ${?DB_PASSWORD}
 sql: &amp;#34;SELECT id, title, body, published_at FROM articles WHERE active = true&amp;#34;
 idField: &amp;#34;id&amp;#34;
 }
]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration-parameters"&gt;Configuration Parameters&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Parameter&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Required&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;driver&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;JDBC driver class name. The driver JAR must be on the classpath.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;connectionString&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;JDBC connection URL.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;jdbcUser&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;Database username.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;jdbcPassword&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;Database password. Use &lt;code&gt;${?VAR}&lt;/code&gt; for environment variable substitution.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;sql&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;SELECT statement to execute. All returned rows are published as Documents.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;idField&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;Column whose value becomes the Document ID. If omitted, a UUID is generated per row.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;docIdPrefix&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;Prefix prepended to every Document ID.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;fetchSize&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Integer&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;JDBC fetch size hint for streaming large result sets. For MySQL, set to &lt;code&gt;Integer.MIN_VALUE&lt;/code&gt; (i.e., &lt;code&gt;-2147483648&lt;/code&gt;) to avoid buffering the full result set in memory.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;preSQL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;A SQL statement (INSERT, DELETE, UPDATE, or DDL) executed once before the main query. Useful for creating temp tables, acquiring locks, or seeding data.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;postSQL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;A SQL statement executed once after the main query completes successfully. Useful for cleanup, releasing locks, or writing completion markers.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;otherSQLs&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;List&amp;lt;String&amp;gt;&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;Additional SELECT queries to JOIN onto the primary result. Each query must return rows ordered by its join key.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;otherJoinFields&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;List&amp;lt;String&amp;gt;&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;Join fields parallel to &lt;code&gt;otherSQLs&lt;/code&gt;. Required when &lt;code&gt;otherSQLs&lt;/code&gt; is specified. Must be integer-valued columns.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ignoreColumns&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;List&amp;lt;String&amp;gt;&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;Column names to skip when populating Documents.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;connectionRetries&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Integer&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;Number of connection retry attempts on failure.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;connectionRetryPause&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Integer&lt;/td&gt;
 &lt;td&gt;10000&lt;/td&gt;
 &lt;td&gt;Milliseconds to wait between connection retries.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="pre-and-post-sql"&gt;Pre and Post SQL&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;preSQL&lt;/code&gt; and &lt;code&gt;postSQL&lt;/code&gt; to run setup and teardown logic that must happen before and after the main query:&lt;/p&gt;</description></item><item><title>Solr Connector</title><link>https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/solr_connector/</link><pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate><guid>https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/solr_connector/</guid><description>&lt;p&gt;&lt;a href="https://github.com/kmwtechnology/lucille/blob/main/lucille-core/src/main/java/com/kmwllc/lucille/connector/SolrConnector.java"&gt;Source Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;SolrConnector&lt;/code&gt; issues a query against a Solr collection and publishes each result as a Lucille Document. It is useful for cross-index enrichment pipelines — for example, reading documents from one Solr collection, enriching them, and indexing them into a different collection or backend.&lt;/p&gt;
&lt;p&gt;Internally, the connector uses cursor-based pagination (&lt;code&gt;cursorMark&lt;/code&gt;) to iterate through large result sets without loading the full result into memory. Results are sorted by &lt;code&gt;idField&lt;/code&gt; ascending (required for cursor pagination).&lt;/p&gt;</description></item><item><title>Kafka Connector</title><link>https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/kafka_connector/</link><pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate><guid>https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/kafka_connector/</guid><description>&lt;p&gt;&lt;a href="https://github.com/kmwtechnology/lucille/blob/main/lucille-core/src/main/java/com/kmwllc/lucille/connector/KafkaConnector.java"&gt;Source Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;KafkaConnector&lt;/code&gt; reads Documents from a Kafka topic and publishes them into a Lucille pipeline. This is distinct from Kafka&amp;rsquo;s role as the &lt;em&gt;messaging layer&lt;/em&gt; in distributed mode — the &lt;code&gt;KafkaConnector&lt;/code&gt; is a data &lt;em&gt;source&lt;/em&gt;, reading documents produced by an upstream system.&lt;/p&gt;
&lt;h2 id="use-cases"&gt;Use Cases&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Streaming ingest from Kafka:&lt;/strong&gt; An upstream application publishes documents (as JSON) to a Kafka topic, and Lucille reads them for enrichment and indexing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connectorless distributed mode:&lt;/strong&gt; In this deployment pattern, a third-party publisher puts documents onto a Kafka source topic, and Lucille Workers consume them directly. In this case the &lt;code&gt;KafkaConnector&lt;/code&gt; is not used — Workers listen to the source topic directly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuration"&gt;Configuration&lt;/h2&gt;
&lt;p&gt;All Kafka connection parameters are nested under the &lt;code&gt;kafka&lt;/code&gt; key within the connector config block.&lt;/p&gt;</description></item><item><title>Parquet Connector</title><link>https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/parquet_connector/</link><pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate><guid>https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/parquet_connector/</guid><description>&lt;p&gt;&lt;a href="https://github.com/kmwtechnology/lucille/blob/main/lucille-plugins/lucille-parquet/src/main/java/com/kmwllc/lucille/parquet/connector/ParquetConnector.java"&gt;Source Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;ParquetConnector&lt;/code&gt; reads &lt;a href="https://parquet.apache.org/"&gt;Apache Parquet&lt;/a&gt; files — locally or from Amazon S3 — and publishes each row as a Lucille Document. Parquet is a columnar format commonly used to store pre-computed embeddings, feature vectors, and large datasets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maven dependency:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.kmwllc&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;lucille-parquet&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${lucille.version}&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configuration"&gt;Configuration&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-hocon" data-lang="hocon"&gt;connectors: [
 {
 name: &amp;#34;parquet-source&amp;#34;
 class: &amp;#34;com.kmwllc.lucille.parquet.connector.ParquetConnector&amp;#34;
 pipeline: &amp;#34;my-pipeline&amp;#34;
 pathToStorage: &amp;#34;/data/embeddings.parquet&amp;#34;
 idField: &amp;#34;doc_id&amp;#34;
 fsUri: &amp;#34;file:///&amp;#34;
 }
]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration-parameters"&gt;Configuration Parameters&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Parameter&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Required&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;pathToStorage&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;Path to a Parquet file or directory to traverse for &lt;code&gt;.parquet&lt;/code&gt; files.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;idField&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;Field name in the Parquet schema to use as the Document ID. Must exist in the file&amp;rsquo;s schema.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;fsUri&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;URI for the filesystem to use (e.g., &lt;code&gt;&amp;quot;file:///&amp;quot;&lt;/code&gt; for local, &lt;code&gt;&amp;quot;s3a://my-bucket&amp;quot;&lt;/code&gt; for S3).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;s3Key&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;AWS S3 access key. Required when using S3.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;s3Secret&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;String&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;AWS S3 secret key. Required when using S3.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;limit&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Long&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;Maximum number of Documents to publish. Default: no limit.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;start&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Long&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;Number of rows to skip from the beginning of each file. Default: &lt;code&gt;0&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="s3-configuration"&gt;S3 Configuration&lt;/h2&gt;
&lt;p&gt;For S3, provide the filesystem URI and credentials:&lt;/p&gt;</description></item><item><title>RSS Connector</title><link>https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/rss_connector/</link><pubDate>Fri, 06 Jun 2025 00:00:00 +0000</pubDate><guid>https://kmwtechnology.github.io/lucille/docs-0.11.0/ingest-design/connectors/rss_connector/</guid><description>&lt;h3 id="the-rssconnector"&gt;The RSSConnector&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;RSSConnector&lt;/code&gt; allows you to publish Documents representing the items found in an RSS feed of your choice. Each Document will
(optionally) contain fields from the RSS items, like the author, description, title, etc. By default, the Document IDs will be the
item&amp;rsquo;s &lt;code&gt;guid&lt;/code&gt;, which should be a unique identifier for the RSS item.&lt;/p&gt;
&lt;p&gt;You can configure the &lt;code&gt;RSSConnector&lt;/code&gt; to only publish recent RSS items, based on the &lt;code&gt;pubDate&lt;/code&gt; found on the items.
Also, it can run incrementally, refreshing the RSS feed after a certain amount of time until you manually stop it. The &lt;code&gt;RSSConnector&lt;/code&gt;
will avoid publishing Documents for the same RSS item more than once.&lt;/p&gt;</description></item></channel></rss>