Skip to main content
Smart Search in Joomla

Smart Search in Joomla

29 April 2026

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:

FeatureLegacy 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 versionSearch 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.

BlockRole
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:

PieceWhat 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:

PluginPurpose
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:

ParameterWhat 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_tokens and #__finder_tokens_aggregate tables use MySQL's MEMORY storage engine. They live in RAM and are wiped between indexer runs. If indexing a huge site hits max_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.

FieldDefault 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 run and 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:

SyntaxMeaning
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: joomal will 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

KindHow 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:

  1. On-save indexing: plg_content_finder re-indexes a single item on save or publish.
  2. 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:

  1. Resolves the current user's access levels.
  2. Filters out links the user cannot see.
  3. 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:

StateIndexed?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:

EventWhen 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:

  1. Copy the plugin file to a custom plugin. Do not edit core.
  2. Adjust the weight constants used in addInstruction(), such as Indexer::TITLE_CONTEXT, TEXT_CONTEXT, META_CONTEXT, and BODY_CONTEXT.
  3. 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_content and friends)?
  • Is the item published, with publish_up in 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_links row 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_search is the legacy component, removed in Joomla 5.
  • com_finder is 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.php if 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_time and memory_limit for 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:

SettingWhereWhat 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.php in 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.

About the author: Peter Martin is a Joomla specialist at db8.nl in Nijmegen, the Netherlands. He helps organisations with Joomla support, maintenance, troubleshooting, and custom development.

Smart Search in Joomla
Peter Martin

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

© Peter Martin / db8 Website Support. All rights reserved.