Appearance
Quick Start Guide
This guide will help you configure Search with Elastic and get it running. This guide assumes you have Elasticsearch already available.
Prerequisites
- Craft CMS 4.x
- PHP 8.x
- Elasticsearch 7.x or 8.x (must be available and accessible)
Step 1: Install Plugin
Install via Composer:
bash
composer require pennebaker/craft-searchwithelasticInstall in Craft:
bash
php craft plugin/install search-with-elasticStep 2: Verify Elasticsearch
Verify Elasticsearch is running:
bash
curl -s localhost:9200/_cluster/health | grep -o '"status":"[^"]*"'Expected: "status":"green" or "status":"yellow"
Step 3: Configure Connection
Go to Settings → Plugins → Search with Elastic → Settings
Minimal required settings:
| Field | Value |
|---|---|
| Elasticsearch Endpoint | localhost:9200 |
| Enable Authentication | ☐ (unchecked) |
Click Save and verify you see the green "✓ Connection successful" message.
Step 4: Index Your Content
Create indexes and add content:
bash
# Create empty indexes
php craft search-with-elastic/index/recreate-empty-indexes
# Index all content (or start small with just entries)
php craft search-with-elastic/index/reindex-entriesYou'll see progress output:
Reindexing 25 entries ...
- [1/25] Reindexing Homepage (1) ... done
- [2/25] Reindexing About (2) ... done
...
Done reindexing entries.Step 5: Test Search
Create a test template at templates/search-test.twig:
twig
{# Quick search test #}
{% set searchTerm = craft.app.request.getQueryParam('q', 'home') %}
{% set results = craft.searchWithElastic.search(searchTerm) %}
<h1>Search Test</h1>
<p>Searching for: "{{ searchTerm }}"</p>
<p>Found: {{ results|length }} results</p>
{% for result in results %}
<div style="border: 1px solid #ccc; margin: 10px; padding: 10px;">
<h3>{{ result.title }}</h3>
<p>{{ result.url }}</p>
<small>Type: {{ result.elementType }}</small>
</div>
{% endfor %}
<hr>
<form>
<input type="text" name="q" value="{{ searchTerm }}" placeholder="Search...">
<button type="submit">Search</button>
</form>Visit /search-test in your browser and try searching!
Setup Complete
You now have Elasticsearch-powered search running. Your content is indexed and searchable.
What You Just Set Up
- ✅ Plugin installed and connected to Elasticsearch
- ✅ Default configuration (indexes all live entries, assets, categories)
- ✅ Content indexed and searchable
- ✅ Basic search functionality working
Quick Customization
Index More Content Types
bash
# Add assets (PDFs, documents)
php craft search-with-elastic/index/reindex-assets
# Add categories
php craft search-with-elastic/index/reindex-categories
# Everything at once
php craft search-with-elastic/index/reindex-allBasic Search Template
Replace your test template with a proper search page:
twig
{# templates/search.twig #}
{% set searchTerm = craft.app.request.getQueryParam('q', '') %}
{% set results = searchTerm ? craft.searchWithElastic.search(searchTerm) : [] %}
<div class="search-page">
<form class="search-form">
<input type="text" name="q" value="{{ searchTerm }}"
placeholder="Search..." required>
<button type="submit">Search</button>
</form>
{% if searchTerm %}
<h2>{{ results|length }} results for "{{ searchTerm }}"</h2>
{% for result in results %}
<article class="search-result">
<h3><a href="{{ result.url }}">{{ result.title }}</a></h3>
{% if result.summary %}
<p>{{ result.summary|striptags|slice(0, 200) }}...</p>
{% endif %}
<small>{{ result.elementType }} • {{ result.dateUpdated|date('M j, Y') }}</small>
</article>
{% endfor %}
{% endif %}
</div>Filter by Content Type
twig
{# The search results include an elementType field that can be used for filtering #}
{% set allResults = craft.searchWithElastic.search(searchTerm) %}
{# Filter results by type after searching #}
{% set entryResults = allResults|filter(r => r._source.elementType == 'entry') %}
{% set assetResults = allResults|filter(r => r._source.elementType == 'asset') %}Common Next Steps
1. Customize What Gets Indexed
Go to Settings → Search with Elastic and configure:
- Element Type Settings - Exclude specific entry types, asset volumes, etc.
- Status Filtering - Choose which statuses to index (live, pending, etc.)
- Asset Types - Select which file types to process (PDFs, docs, etc.)
2. Add Search to Your Templates
twig
{# Add to your layout #}
<form action="/search" method="get" class="site-search">
<input type="text" name="q" placeholder="Search site...">
<button type="submit">Search</button>
</form>3. Configure Highlighting
Highlighting can be configured in config/search-with-elastic.php:
php
<?php
return [
'highlight' => [
'pre_tags' => '<mark>',
'post_tags' => '</mark>',
],
];4. Automatic Indexing
The plugin automatically indexes content when you save or delete entries, assets, categories, and products.
Troubleshooting
Search returns no results?
- Check that content was indexed:
curl localhost:9200/_cat/indices - Verify connection in plugin settings
- Try reindexing:
php craft search-with-elastic/index/reindex-entries
Plugin settings won't save?
- Check Elasticsearch is running:
curl localhost:9200 - Verify endpoint URL (include protocol if using HTTPS)
- Check server logs for detailed errors
Next Steps
- Complete Installation Guide - Advanced configuration options
- Configuration Guide - Customize indexing and search behavior
- Template Usage - Advanced search templates and filtering
- Events Documentation - Service APIs and events for developers