SANDI Solr

Service Overview & API Reference

1Overview

SANDI Solr is a hybrid search and indexing platform built on Apache Solr 9 and Spring Boot 3. It exposes two independent REST applications — a Search API and an Index / Admin API — and coordinates a set of external AI microservices for embedding generation, natural language processing, language model inference, and cross-encoder reranking. All AI services communicate over simple HTTP JSON contracts, making them interchangeable between local GPU models and cloud providers such as OpenAI.

Module map

ModuleArtifactDefault portResponsibilities
basesandi-base.jarShared models, services, Solr client, utilities — library only
searchsandi.war8081Search API: hybrid search, spell check, query expansion, reranking, RAG answers
indexsandi.war8082Index API, Delete API, Schedule API, Admin API; document parsing and embedding pipeline

AI service map

ServiceDefault portTechnologyUsed by
Embedding (emb)8085Qwen3 Embeddings / OpenAIIndex: text→vector; Search: query→vector
NLP (nlp)8086SpaCySearch: entity extraction, POS, lemmatization
LLM (llm)8087Qwen3-4B / OpenAISearch: spell check, query expansion, RAG answers
Reranker (rer)8088Qwen3-Reranker / OpenAISearch: reorder results by cross-encoder relevance
Client search hook (cls)configurableCustom PythonSearch: optional per-client pre/post processing
Client index hook (cli)configurableCustom PythonIndex: optional per-client document transformation

Request flow

Client app
Search API :8081
NLP :8086
EMB :8085
SolrCloud
Reranker :8088
LLM :8087 (RAG)
Response
Client app
Index API :8082
CLI hook (opt)
Chunking
EMB :8085
SolrCloud
Response

2Common Conventions

Required fields on every request

FieldTypeDescription
requestIdStringCaller-supplied correlation ID. Returned in every response unchanged. Used in all server-side log entries to trace a request end-to-end.
clientIdStringIdentifies the tenant. Must match an existing, active client record. Determines which Solr collection, field mappings, synonyms, and AI service endpoints are used.

Standard response envelope

FieldValueMeaning
status"SUCCESS"Request completed without errors
status"ERROR"Request failed — see message for detail
status"MISSING"A required field was absent; requestId in the response is "MISSING"
status"SCHEDULED"Job accepted by the scheduler (Schedule API only)
status"CANCELLED"Job cancelled successfully (Schedule API only)

HTTP status codes

CodeWhen returned
200 OKRequest succeeded
400 Bad RequestMissing required field, invalid parameter value, or inactive/unknown client
404 Not FoundAddressed resource (client, collection, job) does not exist
500 Internal Server ErrorUnexpected server-side failure; details in message

Base URLs

# Search module http://<host>:8081/search http://<host>:8081/typeahead # Index module http://<host>:8082/index http://<host>:8082/delete http://<host>:8082/schedule http://<host>:8082/admin

3Search API

The Search API exposes one logical operation — execute a search — available as both POST (JSON body) and GET (query parameters).

POST /search Search module · port 8081

Accepts a JSON body. Preferred for complex queries with many optional flags.

GET /search Search module · port 8081

Same parameters as POST but passed as query string. Suitable for simple queries and browser testing.

Request fields

FieldTypeRequiredDefaultDescription
requestIdStringYesCorrelation ID
clientIdStringYesTenant identifier
searchQueryStringNoNatural-language query text. Processed by NLP and embedding services when AI features are enabled.
filterQueryStringNoSolr filter query (fq). Applied after main search to narrow results without affecting relevance scores.
queryStringNoRaw Solr query string. Bypasses NLP processing. Use when you need exact Solr syntax control.
pageNumberIntegerNo11-based page number
pageSizeIntegerNo10Results per page. Maximum 10 000.
resultFieldsStringNoall fieldsComma-separated list of fields to return in each result document
sortFieldsStringNoscore descSolr sort expression, e.g. date desc,score desc
groupFieldsStringNoComma-separated fields to group results by (Solr field collapsing)
facetFieldsStringNoComma-separated fields to compute facet counts for
highlightFieldsStringNoComma-separated fields to apply snippet highlighting to
highlightTagsStringNo<em>,</em>Open/close highlight tags separated by comma
searchClientsStringNoComma-separated additional client IDs whose collections are also searched (cross-client search)
searchCollectionsStringNoclient collectionOverride the Solr collections to search
precisionStringNo"medium"Search precision level: high, medium, or low. Affects vector score thresholds and query strategy.
exactBooleanNofalseWhen true, only exact phrase matches are returned; vector/semantic path is skipped
legacyBooleanNofalseForce BM25-only keyword search; disables all vector search
synonymsBooleanNofalseExpand the query using synonym sets configured on the client
dymBooleanNofalse"Did You Mean" — send query to LLM for spelling correction; returns dymQuery in response
expandBooleanNofalseQuery expansion — LLM generates alternative phrasings and adds them to the search
rerankBooleanNofalsePass the result page through the reranking service to reorder by cross-encoder relevance
ragBooleanNofalseGenerate a natural-language answer from the top results using the LLM; returned in ragAnswer
collapseBooleanNofalseCollapse duplicate documents (POST only)
debugBooleanNofalseInclude internal score and query detail in the debug response field (POST only)

Response fields

FieldTypeDescription
requestIdStringEchoed from the request
statusStringSUCCESS or ERROR
messageStringError detail when status is ERROR, otherwise null
foundResultsLongTotal matching documents in the index (not just the current page)
startLongZero-based offset of the first returned document
tookIntegerServer-side processing time in milliseconds
dymQueryStringSpell-corrected query suggested by the LLM when dym=true. Null if no correction was needed.
ragAnswerStringNatural-language answer generated from the top results when rag=true
resultsArrayArray of Solr document objects. Field set determined by resultFields.
debugObjectInternal scoring and query detail. Present only when debug=true.

Example — hybrid search with reranking and RAG

Request (POST /search)

{ "requestId": "req-s-001", "clientId": "acme", "searchQuery": "electric vehicle charging", "pageNumber": 1, "pageSize": 10, "precision": "medium", "synonyms": true, "dym": true, "rerank": true, "rag": true }

Response

{ "requestId": "req-s-001", "status": "SUCCESS", "message": null, "foundResults": 142, "start": 0, "took": 387, "dymQuery": null, "ragAnswer": "EV charging infrastructure requires level-2 AC chargers for residential use and DC fast chargers for corridors.", "results": [ { "id": "doc-789", "title": "EV Charging Guide", "score": 0.94 } ] }

Example — GET search with filter

GET /search?requestId=req-s-002&clientId=acme&searchQuery=maintenance+schedule&filterQuery=category:equipment&pageSize=5&synonyms=true

Precision level reference

ValueVector thresholdBehaviour
highStrictOnly results with high vector similarity are returned. Best for technical or factual queries where precision matters more than recall.
mediumModerateDefault. Balances precision and recall. Suitable for most general-purpose searches.
lowRelaxedReturns more results, including weakly related documents. Useful for exploratory search or thin corpora.

4Index API

POST /index Index module · port 8082

Accepts an array of JSON documents and immediately indexes them into the client's Solr collection. Each document is chunked, embedded, and written to Solr in a single synchronous call. For large bulk imports use the Schedule API instead.

Request fields

FieldTypeRequiredDescription
requestIdStringYesCorrelation ID
clientIdStringYesTenant identifier
dataArray of objectsYesOne or more JSON documents to index. Each object can contain any fields — field importance mapping is determined by the client configuration (fieldsHigh, fieldsLow, fieldsContent).

Response fields

FieldTypeDescription
requestIdStringEchoed from the request
statusStringSUCCESS or ERROR
messageStringHuman-readable result or error detail
indexedIntegerNumber of documents successfully indexed

Document ID resolution

SANDI resolves a unique document ID in this order:

  1. The value of the id field in the document, if present
  2. The value of the uri field, if present
  3. A generated UUID — used when neither id nor uri is provided

Example

Request (POST /index)

{ "requestId": "req-i-001", "clientId": "acme", "data": [ { "id": "doc-001", "title": "Product Overview", "category": "documentation", "content": "SANDI Solr provides hybrid search combining BM25 and dense vectors..." }, { "uri": "https://docs.acme.com/gs", "title": "Getting Started", "author":"Jane Smith", "body": "Follow these steps..." } ] }

Response

{ "requestId": "req-i-001", "status": "SUCCESS", "message": "JSON indexing completed successfully", "indexed": 2 }
The Index API always performs force-reindexing — if a document with the same ID already exists it is overwritten. To control deduplication behaviour for large bulk jobs, use the Schedule API with forceReindexing set to false.

5Delete API

POST /delete Index module · port 8082

Deletes one or more documents from the client's Solr collection. Three deletion modes can be used simultaneously in a single request.

Request fields

FieldTypeRequiredDescription
requestIdStringYesCorrelation ID
clientIdStringYesTenant identifier
idStringOne of threeDelete a single document by its ID
idsArray of StringOne of threeDelete multiple documents by their IDs
queryStringOne of threeDelete all documents matching a Solr query string
At least one of id, ids, or query must be provided. If none are present the request returns an error with the message "Nothing to delete".

Response fields

FieldTypeDescription
requestIdStringEchoed from the request
statusStringSUCCESS or ERROR
messageStringResult detail or error description
deletedIntegerCount field (currently always 0 — deletion count is not returned by Solr commit)

Examples

Delete by single ID

{ "requestId": "req-d-001", "clientId": "acme", "id": "doc-001" }

Delete by multiple IDs

{ "requestId": "req-d-002", "clientId": "acme", "ids": ["doc-001", "doc-002", "doc-003"] }

Delete by query

{ "requestId": "req-d-003", "clientId": "acme", "query": "category:obsolete" }

Combined (all three modes in one call)

{ "requestId": "req-d-004", "clientId": "acme", "id": "doc-old", "ids": ["doc-x", "doc-y"], "query": "status:deleted" }

6Schedule API

The Schedule API manages background indexing jobs. Jobs are stored in memory and checked every second by IndexingJobScheduler. When a job's scheduledTime is reached it is executed asynchronously.

POST /schedule/index

Create and schedule a new indexing job.

Request fields

FieldTypeRequiredDescription
requestIdStringYesCorrelation ID
clientIdStringYesTenant identifier
jobTypeStringYesSee job type table below
directoryStringYesFile system path or URL to process
jobIdStringNoExplicit job ID. If omitted, requestId is used.
cronStringNoCron expression for recurring jobs. If omitted the job runs once.
fileExtensionsStringNoComma-separated file extensions to include, e.g. "pdf,docx". Used with file-based job types.
forceReindexingBooleanNoIf true, re-index documents that already exist. Default false — existing documents are skipped.
scheduledTimeDateTimeNoISO-8601 datetime when the job should run. Must be in the future. If omitted, the job is scheduled 5 seconds from now.
createdTimeDateTimeNoJob creation timestamp. Informational.

Response fields

FieldTypeDescription
requestIdStringEchoed from the request
statusStringSCHEDULED on success, ERROR on failure
messageStringConfirmation or error detail
jobIdStringAssigned job ID — use for status polling and cancellation
scheduledTimeDateTimeEffective scheduled execution time
createdTimeDateTimeJob creation time

Job type reference

jobTypeDescriptiondirectory value
JSONLProcess a directory of JSONL files (one JSON object per line)File system path
JSONProcess a directory of JSON files (each file is a single document or array)File system path
TXTProcess a directory of plain text filesFile system path
TXTLProcess a directory of text files, one document per lineFile system path
EXCELProcess Excel spreadsheets (.xlsx); each row becomes a documentFile system path
SITECrawl and index a website; uses Apache Tika for HTML extractionRoot URL to crawl
SITEMAPIndex URLs listed in an XML sitemapSitemap XML URL
JSONMAPJSONL with an explicit field mapping definitionFile system path

Job status lifecycle

SCHEDULED → at scheduledTime → RUNNING → on completion → COMPLETED
RUNNING → on error → FAILED
SCHEDULED → cancel request → CANCELLED
Only SCHEDULED jobs can be cancelled. A RUNNING job cannot be cancelled.

Schedule job example

Request

{ "requestId": "req-sc-001", "clientId": "acme", "jobId": "import-docs-april", "jobType": "JSONL", "directory": "/data/uploads/april", "fileExtensions": "jsonl", "forceReindexing":false, "scheduledTime": "2026-04-16T03:00:00" }

Response

{ "requestId": "req-sc-001", "status": "SCHEDULED", "message": "Indexing job created and scheduled", "jobId": "import-docs-april", "scheduledTime":"2026-04-16T03:00:00", "createdTime": null }
GET /schedule/jobs

Returns all jobs (scheduled, running, completed, failed, cancelled) as an array of IndexingJob objects.

IndexingJob object fields

FieldTypeDescription
jobIdStringUnique job identifier
clientIdStringAssociated tenant
jobTypeStringJob type constant
statusEnumCurrent status: SCHEDULED / RUNNING / COMPLETED / FAILED / CANCELLED
cronStringCron expression (null for one-time jobs)
directoryStringSource file path or URL
fileExtensionsStringIncluded file extensions
forceReindexingBooleanWhether existing documents are overwritten
scheduledTimeDateTimeWhen the job is/was scheduled to run
createdTimeDateTimeWhen the job was submitted
startedTimeDateTimeActual execution start time
completedTimeDateTimeExecution completion time
messageStringStatus message or error detail
totalFilesintNumber of files found
totalDocumentsintTotal document records found across all files
successfulDocumentsintDocuments indexed successfully
failedDocumentsintDocuments that failed to index
GET /schedule/jobs/{jobId}

Returns a single IndexingJob object. Returns 404 if the job does not exist.

GET /schedule/jobs/status/{status}

Returns all jobs with the given status. Valid values: SCHEDULED, RUNNING, COMPLETED, FAILED, CANCELLED (case-insensitive). Returns 400 for an unrecognised status value.

GET /schedule/jobs/status/RUNNING
POST /schedule/jobs/{jobId}/cancel

Cancels a scheduled job. Returns 400 if the job is not found or is not in SCHEDULED state.

POST /schedule/jobs/import-docs-april/cancel
GET /schedule/stats

Returns a simple counts object.

// Response { "scheduled": 3, "running": 1, "completed": 47 }

7Admin API

The Admin API manages tenants (clients), Solr collections, Solr configurations, and synonym sets. All endpoints require a requestId query parameter.

Client management

GET /admin/clients?requestId=…

Returns an array of all client objects.

GET /admin/clients/{clientId}?requestId=…

Returns a single client object. Returns 404 if not found.

POST /admin/clients?requestId=…

Creates or updates a client. If createCollection is true, a new Solr collection is created using the named configuration set before the client record is saved.

Request body (ClientRequest)

FieldTypeRequiredDescription
clientIdStringYesUnique tenant identifier. Only word characters allowed (no spaces or special chars).
nameStringYesHuman-readable display name
collectionStringNoSolr collection name. Required if createCollection=true.
createCollectionBooleanNoWhen true, creates the Solr collection before saving the client record
configurationStringNoName of the Solr configuration set to use when creating a collection
Field mapping — at least one array must be non-empty
fieldsHighString[]*Fields treated as high-importance for search (titles, headings). Highest BM25 boost.
fieldsLowString[]*Fields treated as low-importance metadata (tags, categories). Lower boost.
fieldsContentString[]*Full-text content fields (body, description). Used for chunking and embedding.
AI service endpoints (override global defaults)
embServiceUrlStringNoEmbedding service URL for this client. Overrides the global sandi.service.emb.url.
llmServiceUrlStringNoLLM service URL for this client
nlpServiceUrlStringNoNLP service URL for this client
rerServiceUrlStringNoReranker service URL for this client
cliServiceUrlStringNoClient index hook URL — called before indexing to transform each document
clsServiceUrlStringNoClient search hook URL — called before and/or after search for custom processing
Behaviour flags
synonymsString[]NoNames of synonym sets to load for this client's searches
legacyBooleanNoDefault to legacy BM25-only search for this client
nestedBooleanNoEnable nested document support (skips document flattening during indexing)
activeBooleanNoInactive clients are rejected by all APIs with a 400 error
clientSearchProcessingBooleanNoEnable the client search hook (clsServiceUrl)
clientIndexProcessingBooleanNoEnable the client index hook (cliServiceUrl)

Create client example

Request

POST /admin/clients?requestId=req-a-001 { "clientId": "acme", "name": "Acme Corp", "collection": "acme_docs", "createCollection": true, "configuration": "sandi_config", "fieldsHigh": ["title", "heading"], "fieldsLow": ["category", "tags"], "fieldsContent": ["body", "summary"], "active": true }

Response

{ "requestId": "req-a-001", "status": "SUCCESS", "message": "Client saved successfully" }
DELETE /admin/clients/{clientId}?requestId=…

Deletes the client record. Does not delete the associated Solr collection. Returns 404 if not found.

Collection management

GET /admin/collections?requestId=…

Returns a list of all Solr collection names.

GET /admin/collections/{name}?requestId=…

Returns a Collection object: { "name": "acme_docs", "configuration": "sandi_config" }.

POST /admin/collections?requestId=…

Creates a new Solr collection. Request body: { "name": "my_collection", "configuration": "sandi_config" }

PUT /admin/collections/{name}?requestId=…

Updates the configuration set linked to an existing collection. The name in the path and body must match.

DELETE /admin/collections/{name}?requestId=…

Deletes the Solr collection and all its data. Returns 404 if not found.

Collection deletion is permanent. All indexed documents are lost.

Configuration management

Solr configurations (config sets) are stored in the directory specified by sandi.collections.config. These endpoints upload them to ZooKeeper so SolrCloud can use them when creating collections.

GET /admin/configurations?requestId=…

Returns a list of all available configuration set names.

POST /admin/configurations/{name}?requestId=…

Uploads the named configuration set from the local file system to ZooKeeper.

DELETE /admin/configurations/{name}?requestId=…

Deletes the named configuration set from ZooKeeper. Returns 404 if not found.

Synonym management

Synonym sets are uploaded to SolrCloud via ZooKeeper and referenced by name in the client's synonyms array.

GET /admin/synonyms?requestId=…

Returns a list of all synonym set names available in ZooKeeper.

POST /admin/synonyms/{name}?requestId=…&fileName=…&language=…

Uploads a synonym file to ZooKeeper.

Query paramRequiredDescription
nameYes (path)Name to register the synonym set under
fileNameYesSource file name on the server file system
languageYesLanguage code, e.g. en
requestIdYesCorrelation ID
DELETE /admin/synonyms/{name}?requestId=…

Deletes the named synonym set from ZooKeeper. Returns 404 if not found.

8Document Indexing Pipeline

Every document submitted to POST /index or processed by a scheduled job passes through the following steps:

1
Client index hook (optional). If clientIndexProcessing=true on the client, the raw document JSON is POSTed to cliServiceUrl. The hook response replaces the original document. Use this to normalise, enrich, or filter documents using custom logic.
2
ID resolution. Document unique ID is resolved from id field, then uri field, then a generated UUID.
3
Deduplication check. If forceReindexing=false, the resolved UUID is checked against existing Solr records. Documents already indexed are skipped.
4
Document flattening. Unless client.nested=true, nested JSON objects are flattened into dot-notation fields (e.g. address.city).
5
Field extraction by importance. Fields are sorted into three buckets — high, low, content — according to the client's field arrays. Unmapped fields are stored but not weighted.
6
Text chunking. Content fields are split into overlapping chunks. Default maximum chunk length is 1 900 characters with a 200-character overlap. Minimum chunk length is 50 characters. Small chunks below the minimum are merged with adjacent ones.
7
Embedding generation. Each chunk is POSTed to the embedding service (POST /embed). The service returns a dense float vector. Chunks are batched — default batch size is 50.
8
Solr write. The document, its chunks, and their vectors are written to the client's Solr collection. Vectors are stored in the internal _embs field; chunks in _chunks.

9Search Query Pipeline

When a search request is received the following steps are executed, each step conditional on the corresponding request flag:

1
Validation. requestId, clientId, pageSize (≤ 10 000), and pageNumber (≥ 1) are validated. The client record is fetched and verified as active.
2
Client search hook (optional). If clientSearchProcessing=true, the request is sent to clsServiceUrl for pre-processing before any AI calls.
3
Synonym expansion (synonyms=true). The query is expanded with terms from the client's synonym sets stored in Solr.
4
Spell check / DYM (dym=true). The query is sent to the LLM service with a spell-checking prompt. If the LLM returns a corrected query, it is stored in dymQuery and used for the remainder of the pipeline.
5
NLP analysis. The (possibly corrected) query is sent to the NLP service. Entity types, lemmas, and part-of-speech tags are extracted and used to adjust the Solr query structure.
6
Query expansion (expand=true). The LLM generates 2–3 alternative phrasings of the query. These are merged into the Solr boolean query as optional clauses.
7
Query embedding. The query text is sent to the embedding service. The returned vector is used for kNN (approximate nearest-neighbour) search against document chunk vectors in Solr.
8
Hybrid Solr query. A combined query is issued: BM25 keyword search against fieldsHigh/fieldsLow/fieldsContent, fused with kNN vector search results. Fusion weights are configurable (weightLegacyQuery default 0.4, weightVectorQuery default 0.8).
9
Reranking (rerank=true). The current result page is sent to the reranker service with the original query. The service returns relevance scores and the result list is reordered.
10
RAG answer generation (rag=true). The top-N document excerpts are concatenated into a context window and sent to the LLM with a question-answering prompt. The generated answer is returned in ragAnswer.

10AI Service HTTP Contracts

Each AI service is a lightweight Python/Flask microservice. SANDI calls them over HTTP; the interface contract below is what SANDI expects, regardless of whether the service is backed by a local GPU model or a cloud API.

Embedding service (emb) · default port 8085

POST /embed

Converts one or more text strings into dense float vectors. Called during indexing (per chunk) and during search (per query).

Request

{ "texts": [ "electric vehicle charging", "battery range anxiety" ] }

Response

{ "vectors": [ [0.021, -0.134, 0.409, ...], [0.087, 0.062, -0.211, ...] ], "took": 48 }
POST /similarity

Computes cosine similarity between two texts. Used internally for relevance checks.

Request

{ "text1": "EV charging station", "text2": "electric vehicle plug" }

Response

{ "score": 0.87, "took": 12 }

NLP service (nlp) · default port 8086

POST /analyze

Runs SpaCy NLP analysis on the input text. Returns entities, part-of-speech tags, and lemmatized tokens. Used by the search pipeline to understand query intent.

Request

{ "text": "Show me Q3 sales reports for Europe" }

Response

{ "entities": [ { "text":"Q3", "label":"DATE" }, { "text":"Europe", "label":"GPE" } ], "tokens": [ { "text":"sales", "lemma":"sale", "pos":"NOUN" }, { "text":"reports", "lemma":"report","pos":"NOUN" } ], "took": 9 }

LLM service (llm) · default port 8087

POST /run

Sends a prompt to the language model and returns generated text. Used for spell check, query expansion, and RAG answer generation. The caller constructs the full prompt; the service returns the raw model output.

Request

{ "prompt": "Correct spelling: 'electic vehicel chargng'. Return only the corrected text.", "max_tokens": 50 }

Response

{ "result": "electric vehicle charging", "took": 234 }
The same /run endpoint is used for all three LLM tasks: spell checking, query expansion, and RAG. SANDI builds a task-specific prompt and parses the plain-text response accordingly.

Reranking service (rer) · default port 8088

POST /rescore

Accepts a query and a list of document text snippets. Returns a relevance score for each document computed by a cross-encoder model. SANDI uses these scores to reorder the search result page.

Request

{ "query": "EV charging cost", "docs": [ "Level 2 chargers cost $500–$1500 installed.", "Battery technology advances in 2024.", "DC fast chargers can charge a car in 20 min." ] }

Response

{ "scores": [ 0.93, 0.12, 0.71 ], "took": 118 }

Scores are in the same order as the input docs array. SANDI sorts the result page by descending score after receiving the response.

11Client Model Reference

The client record is the central configuration object for a tenant. It is stored as a Solr document in the internal _clients collection and loaded at request time for every search and index operation.

FieldTypeDescription
clientIdStringUnique identifier. Word characters only. Used in all API requests as the tenant key.
nameStringHuman-readable display name. Used in admin UIs and log messages.
collectionStringName of the Solr collection that stores this client's documents. Multiple clients can share a collection.
activeBooleanWhen false, all API calls for this client are rejected with 400.
fieldsHighString[]Document fields treated as high-relevance (titles, headings). Receive the highest BM25 boost factor. Also used for high-weight text in the embedding chunk.
fieldsLowString[]Document fields treated as low-relevance metadata (author, category, tags). Lower BM25 boost.
fieldsContentString[]Full-text content fields (body, description, abstract). Used for chunking, embedding, and content-level BM25.
synonymsString[]Names of synonym sets to apply when synonyms=true is passed on a search request.
legacyBooleanWhen true, this client always uses BM25-only search regardless of the request flag.
nestedBooleanWhen true, document flattening is skipped and nested Solr documents are used. Requires a Solr schema with _nest_path_.
embServiceUrlStringOverride the global embedding service URL for this client. Useful when different clients use different embedding models.
llmServiceUrlStringOverride the global LLM service URL for this client.
nlpServiceUrlStringOverride the global NLP service URL for this client.
rerServiceUrlStringOverride the global reranker service URL for this client.
cliServiceUrlStringURL of the client index hook service. Called before indexing each document when clientIndexProcessing=true.
clsServiceUrlStringURL of the client search hook service. Called around the search pipeline when clientSearchProcessing=true.
clientIndexProcessingBooleanEnables the client index hook. Requires cliServiceUrl to be set.
clientSearchProcessingBooleanEnables the client search hook. Requires clsServiceUrl to be set.