The built-in TYPO3 search scans page titles and content – sufficient for small projects, but a bottleneck for enterprise requirements. When you need to make thousands of pages, structured records, and files searchable, you require a dedicated search infrastructure. Apache Solr provides exactly that – and the EXT:solr extension integrates this capability seamlessly into TYPO3.
This article demonstrates how EXT:solr works, what is possible since Solr 9.8 with the language-models module (embedding/vector pipeline, e.g. knn_text_to_vector), and how to implement enterprise search in your project.
Table of Contents
What EXT:solr Achieves
Architecture, components, document lifecycle
PSR-14 Events
Custom fields, custom indexers
Production Checklist
Security, performance, best practices
Conclusion
Summary and next steps
What EXT:solr Achieves
EXT:solr connects TYPO3 to an Apache Solr server and provides a complete enterprise search infrastructure:
Full-text Search
Searchable pages, news, products, and custom records – with language-specific stemming and tokenisation.
Faceted Navigation
Filter by category, date, type, or any custom field – just like in any modern online shop.
Autocomplete
Real-time search suggestions even before pressing the Enter key. With top-result previews.
Architecture Overview
The system consists of four cooperating components:
EXT:solr Architecture: From the editor to the search result
How the document lifecycle works:
- Editors create or edit content in TYPO3.
- The monitoring detects changes via PSR-14 events and writes an entry to the Index Queue.
- A scheduler task processes the queue and sends documents as JSON to the Solr server.
- The search plugin in the frontend sends queries to Solr and renders results via Fluid templates.
Component Overview
| Component | Package | Purpose | Required? |
|---|---|---|---|
| EXT:solr | apache-solr-for-typo3/solr | Core integration: indexing, search, backend module | Yes |
| EXT:tika | apache-solr-for-typo3/tika | Text extraction from PDFs, DOCX, XLSX (~1,200 formats) | Only file search |
| EXT:solrfal | Funding Extension | Index FAL files in Solr | Only file search |
| EXT:solrconsole | Funding Extension | Backend console for Solr management | Optional |
| EXT:solrdebugtools | Funding Extension | Query debugging, score analysis in the frontend | Recommended (dev) |
Version Compatibility
| EXT:solr | TYPO3 | Apache Solr | Configset | PHP |
|---|---|---|---|---|
| 13.1.x (13.1.1) | 13.4 LTS | 9.10.1 | ext_solr_13_1_0 | 8.2 – 8.4 |
| 12.1 | 12.4 LTS | 9.10.1 | ext_solr_12_1_0 | 8.1 – 8.3 |
The 12.4 LTS row is provided for comparison during migrations from older projects. For new developments on TYPO3 v14, the matrix targets 14.3 + EXT:solr 14.0; on v13 LTS, 13.4 + EXT:solr 13.1 remains the appropriate stack.
The 13.1.x line (currently including 13.1.1) uses Solr 9.10.1 and addresses CVE-2025-54988, CVE-2026-22444, and CVE-2026-22022 among others – always check the release notes and the Version Matrix before going live. EXT:tika 13.1 requires Apache Tika Server 3.2.3+ and addresses CVE-2025-54988 and CVE-2025-66516 among others.
The Version Matrix lists TYPO3 14.3 with EXT:solr 14.0, Apache Solr 9.10.1, and the configset ext_solr_14_0_0. As long as stable 14.0.x tags have not yet been published on Packagist, teams often use Composer branches like dev-main / 14.0.x-dev (often with minimum-stability: dev and prefer-stable: true):
Before any upgrade, check the current status on Packagist and GitHub Releases and switch to ^14.0 as soon as stable releases exist. Older integration branches from discussions are secondary to the published matrix and releases .
Setup in under 10 minutes
Installation via Composer
Local Development with DDEV
The fastest way to a local Solr instance is the official DDEV add-on :
The add-on documents a default SOLR_BASE_IMAGE (e.g., solr:9.8). The Version Matrix recommends Solr 9.10.1 for TYPO3 13.4/14.x. For parity with production: e.g., ddev dotenv set .ddev/.env.solr --solr-base-image="solr:9.10.1" and recreate the Solr service (see ddev-typo3-solr README).
Configure cores in .ddev/typo3-solr/config.yaml:
And configure .ddev/config.yaml to create the cores after starting:
| Command | Description |
|---|---|
| ddev solrctl apply | Create cores from configuration |
| ddev solrctl wipe | Delete all cores |
| ddev launch :8984 | Open Solr Admin UI in the browser |
| ddev logs -s typo3-solr | View Solr log files |
Docker Production
For production, the official Docker image provides pre-configured cores for all languages:
Managed Hosting
Two options for anyone who prefers not to operate their own Solr server:
hosted-solr.com
Managed Solr by dkd – the maintainers of EXT:solr. Pre-configured cores starting at approx. 10 EUR/month (Plan 'Small', based on pricing page; excl. VAT as stated by provider).
Mittwald
Managed container platform with Solr service. Access via mw container port-forward --port 8983.
TYPO3 Site Configuration
Add the connection in config/sites/<identifier>/config.yaml:
Never hard-code Solr credentials. Use helhum/dotenv-connector for environment-specific .env files with SOLR_HOST, SOLR_PORT, and SOLR_CORE_*. Commit .env.example, keep .env gitignored.
Index Queue: The Core Component
The Index Queue is the central mechanism through which TYPO3 content reaches Solr.
Document Lifecycle: From the editor to the search result
Indexing Pages
Pages are indexed out of the box – no additional configuration is required. The page indexer renders the page and sends the content to Solr.
Indexing Custom Records
Any TYPO3 table can be added to the index via TypoScript. Here is an example for EXT:news:
The three content objects at a glance:
| Content Object | Purpose |
|---|---|
| SOLR_CONTENT | Removes HTML/RTE tags from field content |
| SOLR_RELATION | Resolves relations (categories, tags), supports multiValue = 1 |
| SOLR_MULTIVALUE | Splits comma-separated fields into multiple values |
Dynamic Fields
EXT:solr uses dynamic field suffixes to add custom fields without requiring a schema change :
| Suffix | Type | Multi? | Example |
|---|---|---|---|
| _stringS | String (unanalysed) | No | category_stringS |
| _stringM | String (unanalysed) | Yes | tags_stringM |
| _textS | Text (analysed) | No | description_textS |
| _intS | Integer | No | year_intS |
| _dateS | Date | No | published_dateS |
| _floatS | Float | No | price_floatS |
| _boolS | Boolean | No | active_boolS |
Monitoring
EXT:solr detects record changes via PSR-14 events. Two modes are available:
- Immediate (Default): Changes are processed directly during the DataHandler operation.
- Delayed: Changes are collected in the event queue (
tx_solr_eventqueue_item) and processed by a separate scheduler task.
Configuration is done via Extension Settings → monitoringType.
Site Hash Strategy
Under Admin Tools → Settings → Extension Configuration → solr, siteHashStrategy controls how the site hash is formed in Solr documents. For new TYPO3 13.4+ projects, siteHashStrategy = 1 (Site Identifier) is recommended; in older defaults, the domain-based variant (0, deprecated) may still be active. Changing the strategy requires a complete reindexing.
Configuring the Search
Basic Configuration
Faceted Navigation
Facets transform the search into an interactive filtering experience :
Available facet types: options (Default), queryGroup, hierarchy, dateRange, numericRange.
Autocomplete / Suggest
The built-in suggest feature uses jQuery by default. For a modern, jQuery-free implementation, EXT:solr allows the integration of a custom vanilla JS frontend.
Highlighting & Spellchecking
Vector and Hybrid Search with Solr 9.8+
Since Apache Solr 9.8 (January 2025), Solr includes the Solr language-models module (Text-to-Vector, embedding pipeline; often referred to as the 'LLM module' in older texts) , which enables semantic search on the Solr server – without a separate vector database, without additional middleware. Classes and configurations follow the org.apache.solr.languagemodels.* / solr.languagemodels.* packages (depending on the Solr version, please check the Reference Guide).
The LLM Module (Solr: 'language-models' / Text-to-Vector)
The pipeline solves the vocabulary mismatch problem of classic keyword search: Users formulate their questions differently than the content does. Texts and search queries are converted into vectors that map semantic similarity.
Vector search: Texts and queries are converted into vectors and compared via KNN
Supported embedding providers (via LangChain4j ):
| Provider | Popular Model | Dimensions |
|---|---|---|
| OpenAI | text-embedding-3-small | 1536 |
| Mistral AI | mistral-embed | 1024 |
| Cohere | embed-v3 | 1024 |
| HuggingFace | Various open-source models | variable |
Hybrid Search: BM25 + Vector
The most powerful configuration combines classic BM25 ranking with vector re-ranking:
This way, you benefit from exact keyword matches and semantic similarity.
Use Cases
| Use Case | Approach |
|---|---|
| Intelligent page search | knn_text_to_vector finds semantically similar content |
| Similar articles | K-Nearest Neighbours on the vector of a document |
| Multilingual bridge | Embeddings match across languages |
| FAQ matching | Match user questions to FAQ answers despite different phrasing |
| RAG retrieval | Solr as the retrieval layer for LLM-supported Q&A systems |
Vectorisation typically runs via external embedding APIs (configured in the Solr model store) – it is not fully 'local' without providing your own model. Take API costs into account, check data protection requirements, and plan fallbacks for API outages.
Native end-to-end support (Index Queue → vector fields → Fluid) in EXT:solr is still evolving. For custom fields, PSR-14 listeners (e.g., BeforeDocumentsAreIndexedEvent) combined with a custom embedding service are suitable – see TYPO3-Solr/ext-solr.
Troubleshooting in 6 Steps
If the search is not working, the problem lies in one of four areas: Connection, Indexing, Solr Core, or Frontend. Proceed systematically.
Diagnosis Flowchart
Systematic troubleshooting: From the connection to the frontend
Common Errors and Solutions
| Symptom | Likely Cause | Solution |
|---|---|---|
| "Search not available" | Solr connection misconfigured | Check site configuration, initialise connection |
| No results | Site hash mismatch | Check siteHashStrategy, reindex |
| Empty Index Queue | TypoScript not loaded | Include static templates on root page |
| Queue items are not indexed | Scheduler task missing | Create "Index Queue Worker" task |
| Facets not visible | faceting = 0 or empty field | Enable faceting, check field values |
| Docker: Permission denied | Volume ownership incorrect | UID 8983 must own /var/solr |
| Jar loading error (Solr 9.8+) | CVE-2025-24814 migration required | Move typo3lib/ to server root or use Docker 13.0.1+ |
Activating Logging
For deeper diagnosis, activate TypoScript logging (only dev/staging):
And configure the log file in config/system/additional.php:
Logging generates a considerable amount of data and impairs performance. Remove plugin.tx_solr.logging and the writerConfiguration from additional.php before going live.
PSR-14 Events for Custom Extensions
EXT:solr triggers PSR-14 events at central points , which you can use for your own logic.
Adding Custom Fields to Documents
Important Events at a Glance
TYPO3 v14: Changes for Developers
If you are upgrading EXT:solr to TYPO3 v14 / Fluid 5.0, the following points, among others, are relevant according to SKILL and upstream:
- Fluid 5.0: Search templates and facet partials require strictly typed ViewHelper arguments, no underscore-prefixed template variables – check your custom overrides.
TypoScriptFrontendController: Custom indexers or plugins that use$GLOBALS['TSFE']must migrate to request attributes / the new frontend simulation.- TCA:
ctrl.searchFieldsis dropped in v14 in favour of'searchable' => trueper column (primarily affects backend search, not Index Queue field mappings).
Production Checklist
ext_solr_13_1_0)SOLR_JAVA_MEM=-Xms512m -Xmx1g)core_de, core_en)Conclusion
EXT:solr elevates TYPO3 search to an enterprise level – with facets, autocomplete, highlighting, and, since Solr 9.8, semantic vector search. The extension is mature, actively maintained by dkd Internet Service , and locally ready to use with DDEV in just a few minutes.
The three key takeaways:
- EXT:solr indexes everything – pages, news, products, files. The Index Queue and PSR-14 events make integration flexible and extensible.
- Vector search on the Solr server – The language-models module (Text-to-Vector, e.g.,
knn_text_to_vector) in Solr 9.8+ brings semantic search to the Solr core; check the EXT:solr integration for all steps in the current release. - The setup is straightforward – install the DDEV add-on, configure the cores, create the scheduler task. Done.
When deciding whether the standard search is sufficient for your project or if a dedicated search infrastructure is needed: as soon as you have more than a few hundred pages, need to make structured data searchable, or require facets – there is no getting around Solr.
TYPO3 Solr Skill
Detailed reference for EXT:solr — Index Queue, search, debugging, language-models/vector search. Main file SKILL.md; additions SKILL-FRONTEND.md (e.g., Suggest without jQuery) and SKILL-SOLRFAL.md (file index). Open-source Agent Skill for Claude, Cursor, and VS Code.