Skip to content

Installation Guide

This guide walks you through installing and configuring Search with Elastic.

Prerequisites

Before beginning, ensure your environment meets the system requirements:

  • Craft CMS 4.x
  • PHP 8.x
  • Elasticsearch 7.x or 8.x (must be available and accessible)

Step 1: Verify Elasticsearch

Test that Elasticsearch is available and running:

bash
curl -X GET "localhost:9200/_cluster/health?pretty"
bash
# Visit in your browser:
http://localhost:9200/_cluster/health

You should see a response like:

json
{
  "cluster_name": "elasticsearch",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 1
}

Step 2: Install the Plugin

Install Search with Elastic via Composer:

bash
composer require pennebaker/craft-searchwithelastic
bash
ddev composer require pennebaker/craft-searchwithelastic
bash
docker-compose exec web composer require pennebaker/craft-searchwithelastic

Step 3: Install in Craft

  1. Navigate to Settings → Plugins in your Craft control panel
  2. Find "Search with Elastic" and click Install
  3. Or install via CLI:
bash
php craft plugin/install search-with-elastic

Step 4: Basic Configuration

Access Plugin Settings

Go to Settings → Plugins → Search with Elastic → Settings

Connection Settings

Configure your Elasticsearch connection:

SettingValueDescription
Elasticsearch Endpointlocalhost:9200Your Elasticsearch server URL
Enable AuthenticationfalseEnable if using auth
Username(optional)HTTP Basic auth username
Password(optional)HTTP Basic auth password
php
<?php

return [
    // Connection settings
    'elasticsearchEndpoint' => env('ELASTICSEARCH_ENDPOINT') ?: 'localhost:9200',
    'isAuthEnabled' => env('ELASTICSEARCH_AUTH_ENABLED') ?: false,
    'username' => env('ELASTICSEARCH_USERNAME') ?: '',
    'password' => env('ELASTICSEARCH_PASSWORD') ?: '',
    
    // Index configuration
    'indexPrefix' => env('ELASTICSEARCH_INDEX_PREFIX') ?: 'craft-',
    'fallbackIndexName' => 'elements',
    
    // Element filtering
    'indexableEntryStatuses' => ['pending', 'live'],
    'indexableProductStatuses' => ['pending', 'live'],
    'indexableDigitalProductStatuses' => ['pending', 'live'],
    'indexableCategoryStatuses' => ['enabled'],
    
    // Frontend content fetching
    'enableFrontendFetching' => true,
    'indexElementsWithoutUrls' => true,
    
    // Asset handling
    'assetKinds' => ['pdf', 'text', 'json', 'xml'],
    'frontendFetchingAssetKinds' => ['text', 'json', 'xml', 'javascript', 'html'],
];
env
# Elasticsearch Configuration
ELASTICSEARCH_ENDPOINT=localhost:9200
ELASTICSEARCH_AUTH_ENABLED=false
ELASTICSEARCH_USERNAME=
ELASTICSEARCH_PASSWORD=
ELASTICSEARCH_INDEX_PREFIX=craft-

Index Configuration

SettingDefaultDescription
Index Prefixcraft-Prefix for all index names
Fallback Index NameelementsDefault index suffix

Your indexes will be named: {prefix}{indexName}-{siteId}

Example: craft-elements-1, craft-products-1

Step 5: Test Connection

Via Control Panel

  1. Go to plugin settings
  2. Click Test Connection button
  3. Verify you see a green success message

Via CLI

bash
php craft search-with-elastic/elasticsearch/test-connection

Expected output:

Testing Elasticsearch connection...
✓ Successfully connected to localhost:9200

Step 6: Initial Indexing

Create Indexes

Create empty indexes for all sites:

bash
php craft search-with-elastic/elasticsearch/recreate-empty-indexes

Index Your Content

Start with a small test to verify everything works:

bash
php craft search-with-elastic/elasticsearch/reindex-all
bash
php craft search-with-elastic/elasticsearch/reindex-entries
bash
php craft search-with-elastic/elasticsearch/reindex-assets

You should see output like:

Reindexing 150 entries ...
    - [1/150] Reindexing Homepage (1) ... done
    - [2/150] Reindexing About Us (2) ... done
    ...
Done reindexing entries.

Step 7: Verify Installation

Check Index Status

Visit your Elasticsearch endpoint to verify indexes were created:

bash
curl -X GET "localhost:9200/_cat/indices?v"

You should see indexes like:

health status index           uuid                   pri rep docs.count
green  open   craft-elements-1 4rF8tOFxTdK... 1   0        150

Test Search Functionality

Create a simple test template to verify search works:

twig
{# templates/search/test.twig #}
{% set query = craft.searchWithElastic.search()
    .query('test')
    .limit(10) %}

{% set results = query.all() %}

<h1>Search Test</h1>
<p>Found {{ results | length }} results</p>

{% for result in results %}
    <div>
        <h3>{{ result.title }}</h3>
        <p>{{ result.url }}</p>
    </div>
{% endfor %}

Configuration Options

Element Type Settings

Configure which content gets indexed:

php
// config/search-with-elastic.php
return [
    // Exclude specific entry types
    'excludedEntryTypes' => ['systemPages', 'redirects'],
    
    // Exclude asset volumes
    'excludedAssetVolumes' => ['cache', 'temp'],
    
    // Exclude category groups
    'excludedCategoryGroups' => ['internal'],
    
    // Asset file types to index
    'assetKinds' => ['pdf', 'text', 'json', 'xml', 'html'],
];

Advanced Configuration

php
// config/search-with-elastic.php
return [
    // Custom index names per element type
    'elementTypeIndexNames' => [
        'craft\\elements\\Entry' => 'content',
        'craft\\elements\\Asset' => 'files', 
        'craft\\commerce\\elements\\Product' => 'products',
    ],
    
    // Search result highlighting
    'highlight' => [
        'pre_tags' => '<mark>',
        'post_tags' => '</mark>',
    ],
    
    // Custom content extraction
    'contentExtractorCallback' => function($html) {
        // Custom HTML processing logic
        return strip_tags($html);
    },
];

Troubleshooting

Common Issues

Connection Failed

✗ Failed to connect to localhost:9200

Solutions:

  • Verify Elasticsearch is running: curl localhost:9200
  • Verify endpoint URL in settings
  • Check authentication credentials

Memory Issues During Indexing

Fatal error: Allowed memory size exhausted

Solutions:

  • Increase PHP memory limit: ini_set('memory_limit', '1G')
  • Index content types separately
  • Use queue workers for large sites

Permission Errors

403 Forbidden: cluster_block_exception

Solutions:

  • Check Elasticsearch disk space
  • Verify authentication settings
  • Check Elasticsearch logs

Debug Mode

Enable debug logging in your Craft config:

php
// config/app.php
return [
    'components' => [
        'log' => [
            'targets' => [
                [
                    'class' => craft\log\FileTarget::class,
                    'logFile' => '@storage/logs/search-elastic.log',
                    'categories' => ['pennebaker\searchwithelastic\*'],
                    'logVars' => [],
                ],
            ],
        ],
    ],
];

Next Steps

Now that installation is complete:

  1. Follow the Quick Start guide for immediate setup
  2. Configure element filtering to match your content strategy
  3. Set up search templates for your frontend
  4. Explore advanced features like custom callbacks and events