
Smart Search in Joomla
Smart Search is the search engine that ships inside Joomla. It is fast, ranked, faceted, multilingual, and already installed - yet many Joomla site owners still treat search as an afterthought.
This article explains how Smart Search really works. It covers the basics for website owners and editors, the practical setup for administrators, and the technical details for developers. You will learn how the index is built, how the query engine ranks results, how multilingual search works, and how to extend Smart Search with your own content types.
Smart Search is the indexed, faceted, multilingual search engine inside Joomla
The goal is simple: help you understand Joomla Smart Search well enough to give your visitors a search experience that actually finds what they are looking for.
1. The Basics
1.1 What is Smart Search?
Smart Search is Joomla's modern site-search engine. The component is called com_finder, which is why developers often call it Finder.
Smart Search:
- Has shipped with Joomla core since Joomla 2.5.
- Builds a search index in the database.
- Queries that index instead of scanning content tables.
- Returns ranked, filterable results.
- Replaces the legacy
com_search, which was removed in Joomla 5.
Old Search ran a live
LIKE '%keyword%'query against#__content. Smart Search builds a real search index that is updated on save.
1.2 Two Search Systems - Know the Difference
If you still hear someone talk about "the Search module" in Joomla, they almost certainly mean Smart Search. The two systems are very different:
| Feature | Legacy Search (com_search) | Smart Search (com_finder) |
|---|---|---|
| Strategy | Live SQL LIKE |
Pre-built index |
| Speed | Slow on large sites | Fast - index lookups |
| Ranking | None or basic | Weighted relevance |
| Filters | None | Taxonomies, dates, types |
| Autocomplete | No | Yes |
| Stemming | No | Yes - per language |
| Synonyms | No | Yes (configurable) |
| Status in Joomla 6 | Removed | The default |
1.3 Joomla Version Timeline
Smart Search has been part of Joomla for over a decade. The status of search through the Joomla versions:
| Joomla version | Search status |
|---|---|
| 1.5 - 2.4 | Only legacy com_search |
| 2.5 | Smart Search introduced |
| 3.x (up to 3.3.12) | Both systems shipped side by side |
| 4.0 | Smart Search reworked - namespaces, DI, CLI finder:index, scheduled task |
| 5.0 | Legacy com_search removed; Smart Search is the only core search |
| 6.x | Smart Search refined - modernised admin UI, faster indexer |
1.4 Where Do I Find Smart Search?
In the Joomla 6 backend, Smart Search lives in several places:
Components → Smart Search (manage indexed items + filters)
Components → Smart Search → Maps (taxonomy branches & nodes)
Components → Smart Search → Filters (saved filter sets)
System → Manage → Plugins (Smart Search content plugins)
System → Manage → Modules (the search box module)
The frontend search page lives at /index.php?option=com_finder, usually exposed through a menu item of type Smart Search → Search.
1.5 The Four Building Blocks
Smart Search has four parts. Understand these four and the rest is configuration.
| Block | Role |
|---|---|
| Indexer | Walks content and writes terms into the index. |
| Index | The database tables that store terms, links, and taxonomies. |
| Query engine | Parses the visitor's search string and ranks matches. |
| Plugins | Content-type adapters - articles, contacts, categories, tags, and so on. |
1.6 The Five Pieces in a Working Setup
A complete Smart Search installation uses five different pieces. Each one is independently enable-able:
| Piece | What it does |
|---|---|
Smart Search Component (com_finder) |
The backend admin interface. |
Smart Search Module (mod_finder) |
The search box on every page. |
| Smart Search Menu Item | The results page. |
Smart Search Plugins (plg_finder_*) |
One adapter per content type. |
Content Plugin (plg_content_finder) |
Keeps the index in sync on save. |
2. Setting Up Smart Search
2.1 Enable the Plugins
Go to System → Manage → Plugins and search for finder. Enable the plugins you actually need:
| Plugin | Purpose |
|---|---|
plg_content_finder |
Auto-updates the index when an article is saved. |
plg_finder_content |
Indexes articles. |
plg_finder_categories |
Indexes categories. |
plg_finder_contacts |
Indexes contacts. |
plg_finder_newsfeeds |
Indexes news feeds. |
plg_finder_tags |
Indexes tags. |
Only enabled plugins contribute to the index. Disable what you do not use and the index stays leaner.
2.2 Build the Index for the First Time
Go to Components → Smart Search and click Index in the toolbar.
- Joomla iterates every enabled content type and writes terms into the index tables.
- A progress bar shows item counts per type.
- The first run on a large site can take minutes. Re-runs after content edits are incremental.
You can also build the index from the command line, which avoids PHP timeouts:
php cli/joomla.php finder:index
2.3 Purge and Rebuild
The Maintenance area has a Purge button that empties every Smart Search table. After purging, run Index again to rebuild from scratch.
Purge when:
- You enabled or disabled content-type plugins.
- You changed a language setting.
- You finished a major content cleanup.
- Ranking looks off and you cannot explain it.
2.4 Place the Search Module
Go to System → Manage → Modules → New → Smart Search and place the module in a visible position, usually the header.
The key parameters are:
| Parameter | What it controls |
|---|---|
| Search Filter | A saved filter applied to every query from this box. |
| Show Label | Show the field label above the input. |
| Show Autocomplete | JavaScript autocomplete suggestions as the visitor types. |
| Show Advanced Search Link | Link to the full results page. |
| Set ItemId | Force a menu item id for the results page. |
2.5 Create the Results Page
Go to Menus → Main Menu → New and choose menu item type Smart Search → Search. The search module submits to this menu item.
The menu item parameters control:
- Number of results per page.
- Whether filter checkboxes appear.
- Whether the description, image, or metadata is rendered.
- Whether matched terms are highlighted.
- Sort order: relevance, date, or popularity.
3. Inside the Index
3.1 The Smart Search Tables
Smart Search stores its data in a small set of dedicated tables:
#__finder_links one row per indexed item (article, contact, ...)
#__finder_links_terms link ↔ term, with weight and context
#__finder_terms every distinct term in the index
#__finder_terms_common stop-words ("the", "and", ...) per language
#__finder_tokens MEMORY engine - scratch tokens during indexing
#__finder_tokens_aggregate MEMORY engine - aggregated tokens during indexing
#__finder_taxonomy taxonomy branches (Type, Category, Language, ...)
#__finder_taxonomy_map link ↔ taxonomy node
#__finder_types registry of indexed content types
#__finder_filters saved filter sets bound to modules or menu items
#__finder_logging search-term log (popular queries)
There are two logical layers:
- Links - what is indexed.
- Terms - the searchable vocabulary, mapped back to links with weights.
The
#__finder_tokensand#__finder_tokens_aggregatetables use MySQL'sMEMORYstorage engine. They live in RAM and are wiped between indexer runs. If indexing a huge site hitsmax_heap_table_size, raise the MySQL setting - do not switch the engine.
3.2 The Taxonomy Tree
Smart Search auto-builds a taxonomy of every indexed item. These taxonomy branches are what the visitor sees as filter checkboxes on the results page:
Branch Examples
───────────── ────────────────────────
Type Article, Category, Contact, News Feed, Tag
Category Site categories (hierarchical)
Language nl-NL, en-GB, *
Author User who created the item
Tag Tags on the item
3.3 Weighted Fields
When Smart Search indexes an article, it assigns different weights to each field. A term in the title scores more than the same term in the body. This is why a title-only match beats a body-only match in the result list.
| Field | Default weight |
|---|---|
| Title | High |
| Meta keywords / tags | High |
| Meta description | Medium |
| Intro text | Medium |
| Full text | Low |
3.4 Language and Stemming
Each indexed term is tagged with a language. At query time:
- The active site language picks the stemmer.
- "running" reduces to stem
runand matches "run", "runs", and "running". - The stemmer is per language - Dutch, English, French, German, and others all have their own rules.
Set the article's language correctly. A Dutch article indexed inside an English index gets the wrong stemmer and weak relevance.
4. Searching as a Visitor
4.1 The Query Syntax
Smart Search supports a small but useful query language:
| Syntax | Meaning |
|---|---|
joomla menus |
Match items that contain joomla AND menus. |
"joomla menus" |
Match the exact phrase. |
joomla -menus |
Match joomla but NOT menus. |
menu* |
Wildcard suffix (Joomla 4 and newer). |
There is no OR and no parentheses. Keep queries simple.
4.2 Fuzziness - What You Do and Do Not Get
Smart Search is not a typo-tolerant fuzzy engine like Algolia. It offers:
- Stem-based fuzziness: "running" finds "run" via the per-language stemmer.
- Wildcard suffix:
menu*matches menus, menubar, and menuitem. - No edit-distance:
joomalwill not find "joomla". A misspelled query returns zero results. - Synonyms: close the gap for known variants (see section 5).
4.3 Autocomplete
When you enable autocomplete on the module, Joomla queries #__finder_terms as the visitor types:
- Suggestions come from indexed terms, not from past queries.
- Stop-words are skipped.
- The list is locale-aware - only terms in the active language are suggested.
4.4 The Results Page
A standard results page shows:
- The hit count and a paginated list of results.
- The title, linked, with matched terms highlighted.
- The description or intro, with matched terms highlighted.
- Badges for type, category, and date.
- A filter sidebar for Type, Language, Category, Author, and Tag.
Each result has a relevance score, hidden by default.
4.5 Filters - Two Kinds
| Kind | How it is built |
|---|---|
| Static taxonomy filters | Auto-generated checkboxes for Type, Category, Tag, and so on. |
| Saved filters | Admin-defined filter sets bound to a module or menu item. |
A saved filter is pre-applied. For example: "this search box only searches Events", or "this results page only shows pages tagged Joomla 6".
4.6 Saved Filters in Detail
Go to Components → Smart Search → Filters → New. Tick the taxonomy nodes you want (for example Category: Events plus Language: nl-NL) and save. Then pick that filter from the dropdown on a search module or menu item.
Typical use cases:
- A per-section search box: "Search the blog only".
- Per-language search results on a multilingual site.
- A knowledge base search that ignores news articles.
5. Maintenance
5.1 Keeping the Index Fresh
You should use two strategies together:
- On-save indexing:
plg_content_finderre-indexes a single item on save or publish. - Scheduled rebuild: a cron task periodically purges and re-indexes everything.
Joomla 4 and newer ships a Smart Search Indexer scheduled task. You can run it from the Scheduled Tasks component or directly via cron:
# Run every night at 03:30
30 3 * * * cd /var/www/site && php cli/joomla.php finder:index
5.2 Statistics
Go to Components → Smart Search → Statistics. The page shows:
- Total indexed items per type.
- Index size.
- Number of terms.
- Recent search log (if logging is enabled).
A growing index with a shrinking term count is usually a sign of duplicates or trashed items still indexed. Purge and re-index.
5.3 Search Logging - What Visitors Actually Search For
In the Smart Search component options, set Gather Search Statistics to Yes. Joomla logs every query to #__finder_logging. View the top queries at Components → Smart Search → Search Terms.
This data is gold for SEO and content strategy:
- High-volume queries with zero results point to a content gap.
- High-volume queries with abandoned clicks point to poor result ranking.
Treat the search log as a backlog. Every popular zero-result query is a piece of content you should write.
5.4 Optimising the Index
Go to Components → Smart Search → Maintenance → Optimise. This:
- Defragments the terms tables.
- Removes orphaned tokens.
- Rebuilds the common-words list.
Run Optimise after a big bulk import or a heavy content prune.
5.5 Synonyms
In Components → Smart Search → Options → Search Tab you can register synonym pairs so a query for one term also matches the other.
joomla,joomla!
nl,netherlands,holland
cms,content management system
event,evenement
How it works:
- One synonym group per line, comma-separated.
- At query time, each token is expanded to its synonym group before lookup.
- Synonyms are stored in the component params, not in a dedicated table.
Good uses include brand variants (Joomla / Joomla!), abbreviations (CMS / content management system), and cross-language hints on a single-language site (event / evenement).
Synonyms apply at query time, not at index time. Add them whenever you like - no re-index needed.
5.6 Stop-words and Common Terms
In Components → Smart Search → Options → Indexing Tab:
- Common-word threshold: a term used in more than X percent of items is auto-flagged as common and effectively ignored.
- Stop-words file: a per-language list shipped by each language plugin.
You rarely need to edit stop-words by hand. The auto-threshold does the right thing on most sites.
5.7 Popular Searches Module
The Smart Search Module - Most Popular Searches renders the top N queries from #__finder_logging as clickable suggestions. It is only available when Gather Search Statistics is enabled. Place it on the homepage and visitors can click a popular search instead of typing.
6. Multilingual Smart Search
6.1 Per-language Indexing
Smart Search indexes each item under its assigned language. Items tagged * (All) are indexed once and matched in every language search.
The active site language decides:
- Which language taxonomy filter is active by default.
- Which stemmer is applied to the query.
- Which stop-words are filtered out.
6.2 Language Plugins
Each language ships a stemmer and a stop-words file:
plugins/finder/
language/en-GB/...
language/nl-NL/...
language/fr-FR/...
Without the right plugin enabled, terms are stored unstemmed. Search still works, but "running" no longer finds "run".
6.3 Multilingual Gotchas
- A search module placed in the All position shows results from all languages unless filtered.
- Use a language-specific menu item for the results page so the URL stays inside the active language.
- Saved filters bound to Language are the cleanest way to scope results per language.
7. Access Control and Privacy
7.1 Access Levels
Each indexed link stores the item's Access level. At query time, Smart Search:
- Resolves the current user's access levels.
- Filters out links the user cannot see.
- Filters out taxonomy filters that would only yield results the user cannot access.
So a Guest never sees Registered-only articles in search results. The same rules apply everywhere in Joomla.
7.2 Unpublished, Archived, Trashed
Smart Search respects the publishing state at index time and the query engine re-checks at search time:
| State | Indexed? | Shown in results? |
|---|---|---|
| Published | Yes | Yes |
| Unpublished | No | No |
| Archived | Yes | Only if requested |
| Trashed | No | No |
| Expired (publish_down) | Entry kept, hidden at runtime | No |
7.3 Privacy of the Search Log
If you enable search logging, you store visitor queries. Treat the log as personal data:
- Anonymise IPs at the webserver level.
- Document retention in your privacy policy.
- Disable logging on highly sensitive sites.
8. Under the Hood (Developer View)
8.1 The Indexing Flow
When plg_content_finder fires on save, this is what happens:
onContentAfterSave
└── Indexer::index($result)
├── tokenise content
├── apply stemmer (per language)
├── strip stop-words
├── compute weights per field context
├── write to #__finder_terms
└── link to taxonomy nodes
The same flow runs in batches during a full re-index, one item at a time.
8.2 The Query Flow
When a visitor searches, this is the flow:
SearchModel::getQuery()
└── Query::tokenise(input)
├── Apply stemmer
├── Look up terms in #__finder_terms
├── Score matches via #__finder_links_terms.weight
├── Apply filter taxonomy joins
├── Apply ACL filter
└── Return ranked, paginated list
The actual SQL is many self-joins on #__finder_terms and #__finder_links_terms. The Joomla Debug plugin can show you the full query if you want the gory detail.
8.3 Writing a Smart Search Plugin
To index your own component's items, create a plugin under plugins/finder/yourcomponent/ and extend the adapter base class:
namespace Acme\Plugin\Finder\Yourcomponent\Extension;
use Joomla\Component\Finder\Administrator\Indexer\Adapter;
use Joomla\Component\Finder\Administrator\Indexer\Indexer;
use Joomla\Component\Finder\Administrator\Indexer\Result;
final class Yourcomponent extends Adapter
{
protected $context = 'Yourcomponent';
protected $extension = 'com_yourcomponent';
protected $layout = 'item';
protected $type_title = 'Yourcomponent Item';
protected $table = '#__yourcomponent_items';
protected function index(Result $item)
{
$item->setLanguage();
$item->addTaxonomy('Type', 'Yourcomponent Item');
$item->addTaxonomy('Category', $item->category);
$item->addTaxonomy('Language', $item->language);
$this->indexer->index($item);
}
}
You then implement setup(), getListQuery(), and getItem() to feed the indexer with your data.
8.4 Plugin Events
Smart Search exposes a small set of events for extensions:
| Event | When it fires |
|---|---|
onFinderCategoryChangeState |
A category state flips - index or de-index. |
onFinderChangeState |
An item state changes. |
onFinderAfterDelete |
An item is deleted - drop the link. |
onFinderAfterSave |
An item is saved - re-index. |
onFinderBeforeIndex |
Hook before the indexer runs (full batch). |
onFinderBeforeSave |
Tweak data right before indexing. |
onContentAfterSave |
The bridge from content into Finder. |
8.5 Querying Smart Search from PHP
You can call the Smart Search query engine from PHP. This is useful for "related results" modules or custom display blocks:
use Joomla\CMS\Factory;
$app = Factory::getApplication();
$app->input->set('q', 'joomla smart search');
$model = $app->bootComponent('com_finder')
->getMVCFactory()
->createModel('Search', 'Site', ['ignore_request' => false]);
$results = $model->getResults();
foreach ($results as $r) {
echo $r->title . ' - ' . $r->route . "\n";
}
8.6 Web Services API
Smart Search exposes results over the Joomla Web Services API:
GET /api/index.php/v1/fields/com_finder/search?filter[q]=joomla
The response is JSON with ranked links, taxonomies, and routes. Combine it with a JavaScript frontend or a static site generator for headless search.
ACL still applies. Anonymous API calls only see Public results.
8.7 Template Overrides
The frontend layouts live in components/com_finder/tmpl/ and modules/mod_finder/tmpl/. Override them in your template:
templates/your_template/html/com_finder/search/default_result.php
templates/your_template/html/mod_finder/default.php
Common overrides include restyling the result card, adding a thumbnail next to each result, replacing the filter sidebar with an off-canvas drawer, or adjusting the pagination markup.
8.8 Tuning Weights
The default field weights live in each Finder plugin. To rebalance:
- Copy the plugin file to a custom plugin. Do not edit core.
- Adjust the weight constants used in
addInstruction(), such asIndexer::TITLE_CONTEXT,TEXT_CONTEXT,META_CONTEXT, andBODY_CONTEXT. - Purge and re-index.
Always copy. Editing core plugins means a Joomla update silently overwrites your changes.
9. Common Mistakes and Pitfalls
9.1 Search Returns No Results
- Did you build the index? Go to
Components → Smart Search → Index. - Are the content plugins enabled (
plg_finder_contentand friends)? - Is the item published, with
publish_upin the past? - Is the language correct? A Dutch query against an English-only index returns nothing.
9.2 Search is Slow
Smart Search should be fast. If it is not:
- Run Optimise.
- Check the
#__finder_linksrow count. An extreme size means stale entries - purge and re-index. - Disable content-type plugins you do not use.
- Look at MySQL tuning, especially
innodb_buffer_pool_size.
9.3 Stale Results After Edits
This usually means plg_content_finder is disabled, or an article save is going through a custom path that skips the event.
- Enable the Content - Smart Search plugin.
- After bulk imports, run
php cli/joomla.php finder:index.
9.4 Confusing Legacy Search with Smart Search
com_searchis the legacy component, removed in Joomla 5.com_finderis Smart Search, the only core search in Joomla 6.
If a tutorial mentions "the Search component", check the date before you follow it.
9.5 Custom Fields and Smart Search
This is a common source of outdated advice. Since Joomla 4.2, Smart Search does index Custom Field values out of the box. No extra extension is needed. Joomla 6 inherits this behaviour.
What gets indexed automatically:
- Values of fields whose type produces searchable text: Text, Textarea, Editor, List, Radio, Checkboxes, URL, Calendar, and so on.
- Per article, contact, category, or user - wherever Custom Fields apply.
- The field's Access level is respected at query time.
What does not get indexed automatically:
- Fields with Searchable = No on the field's Options tab. Opt-out is per field.
- Binary or non-text types: Media file paths, Color, and raw Subform JSON without a render.
- Custom field types from third-party plugins that do not implement the indexer hook.
Gotchas:
- After enabling Custom Fields on existing content, run Purge + re-index so the values land in
#__finder_links_terms. - A Subform value is stored as JSON in the database. Only the rendered output is indexed - override
subform.phpif you need a different shape. - Pre-4.2 sites that migrated up may still have the old workaround installed, such as Tassos Finder or PHProberto Finder Plus. Check whether you still need it.
9.6 SQL Field Gotcha
SQL Custom Fields that query private content can leak data into the search index. The indexer runs as a privileged user, so whatever the SQL returns ends up searchable.
Audit every SQL Custom Field before you rely on Smart Search across multi-tenant data.
9.7 The Index Never Finishes
Symptoms: the indexer page times out, the progress bar stalls.
- Increase
max_execution_timeandmemory_limitfor the indexer run. - Index from the CLI - there is no PHP timeout there.
- Batch by content type: disable all but one plugin, index, repeat.
9.8 Large-site Tuning Knobs
For sites with tens of thousands of items, the defaults are too aggressive. Tune these:
| Setting | Where | What it does |
|---|---|---|
batch_size |
Smart Search Options - Indexing | Items per batch before flushing. |
memory_table_limit |
Smart Search Options - Indexing | When to switch MEMORY tables to disk. |
max_heap_table_size |
MySQL config | Hard cap on MEMORY tables - raise it for big indexes. |
tmp_table_size |
MySQL config | Pair with the above. |
innodb_buffer_pool_size |
MySQL config | The single biggest knob for query speed. |
PHP memory_limit |
php.ini / CLI | The indexer can hold a lot of tokens in RAM. |
10. Beyond Smart Search
10.1 Extensions that Improve Smart Search
- Tassos Finder - indexes Custom Fields, adds AJAX live results, and offers a better autocomplete UI.
- PHProberto Finder / Octopus Finder - adds content-type adapters for popular components like K2, VirtueMart, HikaShop, and EasyBlog.
10.2 When You Outgrow Smart Search
For 95 percent of Joomla sites, Smart Search is more than enough. But when you need faceted commerce search, geo search, or true typo tolerance, consider a dedicated engine:
- Algolia - hosted, instant search. Plugins push Joomla content to Algolia on save and the frontend queries Algolia directly.
- Meilisearch - open-source, self-hosted, fast.
- Elasticsearch / OpenSearch - heavy, powerful, fully customisable.
Only swap engines when you have a clear reason. Smart Search remains a sensible default for almost every Joomla site.
11. Best Practices and Quick Reference
If you only remember a few things from this article, remember these:
- Enable only the content-type plugins you actually use - the index stays leaner.
- Run a full re-index after migrations, content cleanups, or plugin changes.
- Schedule a nightly CLI re-index for large sites.
- Enable search logging - it is your most honest content gap report.
- Set the article language correctly so the right stemmer is used.
- Use saved filters to scope search per section or per language.
- Override
default_result.phpin your template instead of editing core. - Audit SQL Custom Fields before relying on Smart Search.
Cheat Sheet
COMPONENT Components → Smart Search
PLUGINS System → Plugins → "finder"
INDEX Components → Smart Search → Index
PURGE Components → Smart Search → Maintenance → Purge
OPTIMISE Components → Smart Search → Maintenance → Optimise
LOGS Components → Smart Search → Search Terms
MODULE Modules → Smart Search Module → New
RESULTS PAGE Menus → New → Smart Search → Search
SAVED FILTER Components → Smart Search → Filters
CLI INDEX php cli/joomla.php finder:index
TABLES #__finder_links / _terms / _taxonomy / _logging
QUERY SYNTAX "phrase" -exclude word*
OVERRIDE templates/{tpl}/html/com_finder/search/default_result.php
API GET /api/index.php/v1/fields/com_finder/search?filter[q]=...
LEGACY com_search is REMOVED - Smart Search is the search.
12. Summary
Smart Search turns Joomla's site search from a slow LIKE query into a real, ranked, faceted, multilingual search engine. It is already installed in every Joomla site and most owners simply never switch it on.
Smart Search gives you:
- Speed: a pre-built index, millisecond queries.
- Relevance: weighted fields, stemming, language awareness.
- Filters: taxonomy facets out of the box.
- Insight: search logs that reveal content gaps.
- Extensibility: plugins for every content type, including your own.
- Headless-ready: full results over the Web Services API.
Good search is one of the cheapest ways to make a Joomla site feel professional. Visitors who find what they are looking for stay longer, convert more often, and come back. A few hours spent on Smart Search configuration - the right plugins, a scheduled re-index, a sensible results page, and search logging - pays itself back over the life of the site.
If your search currently returns nothing useful, or you suspect that Smart Search has never been properly configured, this is one of the first things worth fixing on any Joomla website.


Joomla en Linux specialist voor snelle, veilige en schaalbare websites.


