Repository navigation
Luxir Output Connector
Module: oc-luxir-output-connector
Class: LuxirOutputConnector
Spring Bean: @Component (activated when spring.opencrawling.output.type=luxir)
The Luxir Output Connector integrates Luxir into OpenCrawling as a high-performance, lightweight search engine and dense vector store. Luxir provides full-text search, dense vector kNN search, hybrid search using Reciprocal Rank Fusion (RRF), faceted filtering, dynamic typing schemas, and native JSON REST APIs over HTTP.
graph TD
A["Crawled Document Chunk"] --> B["oc-embedding-consumer (Spring AI / Ollama)"]
B --> C["Kafka Topic (opencrawling-embedded)"]
C --> D["LuxirStoreWriterConsumer (oc-luxir-output-connector)"]
D --> E["LuxirClient (HTTP/1.1 / JSON API)"]
E --> F["Luxir Collection ('opencrawling')"]
F --> G["Dense Vector Indexing ('embedding_v')"]
-
Native HTTP REST Integration: Lightweight, high-throughput integration using Java 25
HttpClientcommunicating with Luxir's native HTTP API on port9400. -
Dense Vector & Dynamic Schema: Supports vector embeddings with customizable dimensionality (default
1024, matchingmxbai-embed-large) and distance metrics (cosine,l2,ip), plus Luxir dynamic field suffix conventions (_t,_s,_ss,_v,_vs,_i). -
Automatic Collection & Schema Provisioning:
LuxirCollectionInitializerautomatically verifies collection existence on startup and initializes the target collection with explicit vector field schemas viaPOST /collections/{collection}/_schema. -
OIS v1.1 Document Lifecycle & Tombstone Deletes: Supports document removal and tombstone purge operations via Luxir's native
delete_idsbatch endpoint. -
Zero-Trust Security ACLs: Indexes Open Ingestion Standard (OIS) security tokens into multi-valued string array fields (
acl_ss,security_allowed_read_ss,security_denied_read_ss) and inheritance flags (security_inheritance_s: "true"/"false"). -
Admin UI & Health Checker Integration: Fully integrated into OpenCrawling Admin UI (
ConnectorForm.tsx,JobTable.tsx) and verified dynamically byConnectorCheckerServiceviaGET /collections/{collection}. -
Decoupled Architecture: Features
LuxirStoreWriterConsumerconsuming from the Kafkaopencrawling-embeddedtopic for horizontal scalability.
All properties are prefixed with spring.opencrawling.output.luxir.*:
| Property | Default | Description |
|---|---|---|
spring.opencrawling.output.luxir.endpoint |
http://localhost:9400 |
HTTP endpoint URL of the Luxir instance |
spring.opencrawling.output.luxir.collection |
opencrawling |
Target Luxir collection name |
spring.opencrawling.output.luxir.vector-field |
embedding_v |
Vector field name in Luxir (_v suffix convention) |
spring.opencrawling.output.luxir.dimensions |
1024 |
Vector dimensionality (matches default mxbai-embed-large) |
spring.opencrawling.output.luxir.similarity |
cosine |
Distance metric: cosine, l2, or ip
|
spring.opencrawling.output.luxir.auto-commit |
true |
Whether to automatically commit index updates |
spring.opencrawling.output.luxir.commit-within-ms |
1000 |
Soft-commit window in milliseconds |
spring.opencrawling.output.luxir.timeout-seconds |
30 |
HTTP connection and socket timeout in seconds |
When initializing a collection, LuxirCollectionInitializer configures the vector field schema via:
POST /collections/opencrawling/_schema
{
"fields": {
"embedding_v": {
"type": "vector",
"dims": 1024,
"metric": "cosine"
},
"passages_vs": {
"type": "vector",
"dims": 1024,
"metric": "cosine",
"multi": true
}
}
}Documents and chunks are indexed via POST /collections/{collection}/_update:
{
"docs": [
{
"id": "doc-001_chunk_0",
"doc_id_s": "doc-001",
"chunk_index_i": 0,
"title_t": "Sample Knowledge Base Article",
"text_t": "Extracted document content...",
"uri_s": "https://example.org/docs/sample.pdf",
"embedding_v": [0.0123, -0.0456, 0.0891, ...],
"acl_ss": ["ROLE_USER", "group:engineering"],
"security_allowed_read_ss": ["ROLE_USER", "group:engineering"],
"security_denied_read_ss": [],
"security_inheritance_s": "true"
}
],
"commit": {}
}Tombstones (action: "DELETE") are processed using delete_ids:
{
"delete_ids": ["doc-001_chunk_0"],
"commit": {}
}Query total document count in the collection using the get_number flag:
curl -X POST "http://localhost:9400/collections/opencrawling/_search" \
-H "Content-Type: application/json" \
-d '{"query": "*:*", "get_number": true}'Search using dynamic text fields (_t):
curl -X POST "http://localhost:9400/collections/opencrawling/_search" \
-H "Content-Type: application/json" \
-d '{"query": "text_t:OpenCrawling"}'Execute dense vector similarity queries using the knn search clause:
curl -X POST "http://localhost:9400/collections/opencrawling/_search" \
-H "Content-Type: application/json" \
-d '{
"query": {
"knn": {
"field": "embedding_v",
"query": [0.01, 0.02, ...],
"k": 5
}
}
}'Spin up Luxir using the standalone Compose definition:
docker compose -f oc-luxir-output-connector/docker/docker-compose.yml up -dThe decoupled architecture definition is located at oc-luxir-output-connector/docker/docker-compose-decoupled-with-luxir.yml and includes:
-
Luxir Search Engine:
luxir/luxir:v0.1.0(withplatform: linux/amd64emulation for ARM64 / Apple Silicon). - Kafka & Zookeeper: Distributed messaging backbone.
- Redis: Distributed deduplication and Claim Check cache.
-
Ollama & Ollama Model Puller: Automatically pulls
mxbai-embed-large(1024 dims). -
OpenCrawling Microservices:
oc-crawler,oc-ingestion-consumer,oc-embedding-consumer,oc-writer-consumer, andoc-mcp-server.
Run the automated end-to-end multi-service pipeline integration test:
./scripts/test-luxir-decoupled.shThe script features detailed live logging, including:
- Docker Compose stack startup and status verification (
compose ps). - Health-check readiness counters for Luxir (
:9400) and Ollama (:11434). - Init container tracking for the
mxbai-embed-largeembedding model. - Crawler execution tracking, exit code validation (
System.exit(0)), and crawler scan log output (compose logs oc-crawler). - Live indexing progress polling against Luxir and writer consumer log output (
compose logs oc-writer-consumer). - Full-text search and 1024-dimensional dense vector kNN query result verification.
- MCP Server HTTP endpoint accessibility check on port
8080. - OIS Document Lifecycle Tombstone DELETE action integration testing via
LuxirStoreWriterConsumerTest. - Clean environment teardown.
- Home
- Quick Start
- VM & Bare-Metal Distribution Installation
- Local Development & Fast Docker Builds
- User Guide
- Architecture
- Zero-Trust Security & ACL Management
- Document Lifecycle Actions & Tombstones
- Apache Tika 4 Text Extraction
- Configuration Guide
- Connectors Reference
- Alfresco Content Services (ACS) Connector
- Alfresco Process Services (APS) Connector
- Flowable Repository Connector
- Camunda Repository Connector
- OASIS CMIS Repository Connector
- Doxis Repository Connector
- M-Files Repository Connector
- SharePoint Online Repository Connector
- Hyland OpenArch Integration (Repository, Output & MCP)
- Relational Database (JDBC) Connector
- Apache StormCrawler Repository Connector
- gRPC Push Repository Connector
- Apache Solr Output Connector
- Luxir Output Connector
- Apache SeaTunnel Output Connector
- Apache Ozone Output Connector (Migration Mode)
- Connector Execution Modes
- Model Context Protocol
- Apache Ozone Claim Check Store
- Lakehouse Audit Reporting & Ledger
- AI-Powered Observability (AIOps)
- Auto-Narrativization Copilot
- Maven Connector Archetypes
- Java Client SDK
- OpenCrawling CLI
- OpenAPI Specification & Swagger UI
- gRPC Internal Transport
- Migration Guide (ManifoldCF)
- Integration Test — Decoupled Pipeline
- M-Files Integration Test
- SharePoint Online Integration Test
- Hyland OpenArch Integration Test
- Local Docker Build Test
- Secure MCP Server Integration Test
- Narrativization Integration Test
- Reporting Integration Test