Appearance
Template Integration 
Learn how to integrate Elasticsearch search functionality directly into your Twig templates using the built-in variable methods and helpers.
Twig Variable Access 
The plugin provides a global Twig variable that gives you access to all search functionality:
twig
{{ craft.searchWithElastic }}All search methods are accessible through this variable, allowing you to perform searches, get index statistics, and debug your search implementation directly from templates.
Core Search Methods 
Basic Search 
Perform a simple search across title and content fields:
twig
{# Basic search with current site #}
{% set results = craft.searchWithElastic.search('coffee recipes') %}
{# Search specific site #}
{% set results = craft.searchWithElastic.search('coffee recipes', 2) %}Parameters:
query(string, required) - The search termsiteId(int, optional) - Site ID to search, defaults to current site
Returns: Array of search results with highlighting and element data
Advanced Search 
Use the advanced search method for more control over search behavior, including direct Elasticsearch queries:
twig
{# Simple advanced search with options #}
{% set results = craft.searchWithElastic.searchExtra('coffee recipes', {
    fuzzy: true,
    fields: ['title', 'content', 'customField'],
    siteId: 2,
    size: 20
}) %}
{# Direct Elasticsearch query #}
{% set searchOptions = {
    size: 20,
    query: {
        multi_match: {
            query: 'coffee',
            fields: ['title^2', 'content'],
            type: 'best_fields'
        }
    },
    highlight: {
        fields: {
            content: {
                fragment_size: 150,
                number_of_fragments: 2
            }
        }
    }
} %}
{% set results = craft.searchWithElastic.searchExtra(null, searchOptions) %}Parameters:
query(string/null) - The search term (can be null when using direct query in options)options(array, optional) - Configuration options:fuzzy(bool) - Enable fuzzy matching (default: true)fields(array) - Fields to search in (default: ['title', 'content'])siteId(int) - Site ID to search (default: current site)size(int) - Number of results to return (default: 50)query(array) - Direct Elasticsearch query objectaggs(array) - Elasticsearch aggregationshighlight(array) - Highlight configurationsort(array) - Sort configuration
Working with Search Results 
Search results are returned as an array of hit objects. Each result contains the indexed document data and optional highlighting:
twig
{% set results = craft.searchWithElastic.search('coffee') %}
{% for hit in results %}
    <article class="search-result">
        <h3>{{ hit._source.title }}</h3>
        <p>{{ hit._source.content | slice(0, 200) }}...</p>
        
        {# Display highlighted snippets if available #}
        {% if hit.highlight %}
            {% for field, highlights in hit.highlight %}
                {% for highlight in highlights %}
                    <p class="highlight">{{ highlight | raw }}</p>
                {% endfor %}
            {% endfor %}
        {% endif %}
        
        {# Access element metadata #}
        <div class="meta">
            <span>Type: {{ hit._source.elementType }}</span>
            <span>ID: {{ hit._source.elementId }}</span>
            {% if hit._source.url %}
                <a href="{{ hit._source.url }}">View Full Article</a>
            {% endif %}
        </div>
    </article>
{% endfor %}Available Source Fields 
Each search result's _source object typically contains:
title- Element titlecontent- Extracted text contentelementType- Craft element type (entry, asset, category, etc.)elementId- Craft element IDsiteId- Site IDurl- Public URL (if available)dateCreated- Creation datedateUpdated- Last update date- Custom fields based on your indexing configuration
 
Debugging and Development 
Get Index Statistics 
Check if your indexes exist and contain documents:
twig
{# Get stats for current site #}
{% set stats = craft.searchWithElastic.getIndexStats() %}
{# Get stats for specific site #}
{% set stats = craft.searchWithElastic.getIndexStats(2) %}
{# Get stats for specific index by name #}
{% set stats = craft.searchWithElastic.getIndexStats('craft-entries-site-1') %}
<div class="debug-info">
    <h4>Index Status</h4>
    <p>Exists: {{ stats.exists ? 'Yes' : 'No' }}</p>
    <p>Documents: {{ stats.documentCount }}</p>
    <p>Index Name: {{ stats.indexName }}</p>
</div>Get All Index Statistics 
View comprehensive statistics for all your Craft-related indexes:
twig
{% set allStats = craft.searchWithElastic.getAllIndexStats() %}
<div class="debug-panel">
    <h4>All Indexes ({{ allStats.totalIndexes }})</h4>
    <p>Total Documents: {{ allStats.totalDocuments }}</p>
    
    {% for index in allStats.indexes %}
        <div class="index-info">
            <h5>{{ index.name }}</h5>
            <ul>
                <li>Documents: {{ index.documentCount }}</li>
                <li>Size: {{ index.size }}</li>
                {% if index.settings %}
                    <li>Shards: {{ index.settings.numberOfShards }}</li>
                    <li>Replicas: {{ index.settings.numberOfReplicas }}</li>
                    <li>Created: {{ index.settings.creationDate }}</li>
                {% endif %}
            </ul>
        </div>
    {% endfor %}
</div>Sample Document Inspection 
Examine what fields are available in your index:
twig
{% set sample = craft.searchWithElastic.getSampleDocument() %}
{% if sample.success %}
    <div class="sample-document">
        <h4>Available Fields</h4>
        <ul>
            {% for field in sample.fields %}
                <li><code>{{ field }}</code></li>
            {% endfor %}
        </ul>
        
        <h4>Sample Document</h4>
        <pre>{{ sample.document | json_encode(constant('JSON_PRETTY_PRINT')) }}</pre>
    </div>
{% else %}
    <p class="error">Error: {{ sample.error }}</p>
{% endif %}Error Handling 
Always handle potential search errors gracefully:
twig
{% set query = craft.app.request.getParam('q', '') %}
{% if query %}
    {% set results = craft.searchWithElastic.search(query) %}
    
    {% if results %}
        <div class="search-results">
            <h2>Found {{ results | length }} results for "{{ query }}"</h2>
            {# Display results... #}
        </div>
    {% else %}
        <div class="no-results">
            <p>No results found for "{{ query }}". Try different keywords.</p>
        </div>
    {% endif %}
{% endif %}Multi-Site Considerations 
When working with multi-site setups, be explicit about which site youre searching:
twig
{# Search all sites #}
{% set allSites = craft.app.sites.allSites %}
{% set allResults = [] %}
{% for site in allSites %}
    {% set siteResults = craft.searchWithElastic.search(query, site.id) %}
    {% if siteResults %}
        {% set allResults = allResults | merge(siteResults) %}
    {% endif %}
{% endfor %}
{# Or search current site specifically #}
{% set currentSiteResults = craft.searchWithElastic.search(query, craft.app.sites.currentSite.id) %}Performance Tips 
- Limit Result Size: Use the 
sizeparameter to control how many results are returned - Cache Results: Consider caching search results for popular queries
 - Field Selection: Limit search fields to only what you need
 - Debug in Development: Use the debugging methods to ensure your indexes are properly populated
 
twig
{# Cache popular searches for 1 hour #}
{% cache using global key "search-#{query | hash}" for 1 hour %}
    {% set results = craft.searchWithElastic.searchExtra(query, {
        size: 10,
        fields: ['title']
    }) %}
    
    {# Render results... #}
{% endcache %}Next Steps 
Now that you understand the basic template integration, explore:
- Search Implementation - Building search forms and handling user input
 - Results Display - Advanced result formatting and pagination
 - Frontend Examples - Complete implementations with AJAX and autocomplete