somardigital/silverstripe-discoverer-elasticsearch

Elasticsearch adaptor for silverstripe/silverstripe-discoverer

Maintainers

Package info

github.com/somardigital/silverstripe-discoverer-elasticsearch

Type:silverstripe-vendormodule

pkg:composer/somardigital/silverstripe-discoverer-elasticsearch

Transparency log

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.0.0 2026-07-21 20:16 UTC

This package is auto-updated.

Last update: 2026-07-30 21:54:21 UTC


README

Elasticsearch adaptor for silverstripe/silverstripe-discoverer.

Installation

composer require somardigital/silverstripe-discoverer-elasticsearch

Configuration

Set an API key and either an endpoint or Elastic Cloud ID:

ELASTIC_SEARCH_ENDPOINT="https://localhost:9200"
ELASTIC_SEARCH_CLOUD_ID="<cloud-id>" # Alternative to ELASTIC_SEARCH_ENDPOINT
ELASTIC_SEARCH_API_KEY="<api-key-or-base64-encoded-id-key>"
ELASTIC_SEARCH_API_ID="<optional-api-key-id>" # Only required if API Key does not contain API ID in base64 encoded string
ELASTIC_SEARCH_INDEX_PREFIX="dev"

ELASTIC_SEARCH_INDEX_PREFIX is optional. If set, Discoverer index suffixes are queried as <prefix>-<suffix>.

Usage

Use Discoverer as usual:

use SilverStripe\Discoverer\Query\Query;
use SilverStripe\Discoverer\Service\SearchService;

$query = Query::create('silverstripe');
$query->addSearchFields(['title' => 2, 'content']);
$query->addResultField('title', 100, true);
$query->setPagination(10, 0);

$results = SearchService::create()->search($query, 'content');

Configure precision profiles if you want Query::setPrecision() to tune Elasticsearch multi_match behaviour per query:

Somar\DiscovererElasticsearch\Processors\SearchRequestProcessor:
  precision_options:
    - precision: 1
      operator: or
      fuzziness: AUTO:3,6
      minimum_should_match: '1<50%'
    - precision: 11
      operator: and
      minimum_should_match: '100%'
$query = Query::create('silverstripe');
$query->setPrecision(11);

When a precision profile is configured, its values are merged into the generated multi_match query. If a query does not set precision, or no matching profile exists, the default Elasticsearch query is unchanged.

Notes

  • Filters are translated to Elasticsearch Query DSL term, terms, range, exists, and nested bool queries.
  • Facets are translated to Elasticsearch terms and range aggregations.
  • Text fields usually need a keyword subfield for exact filters/facets, for example category.keyword.
  • Query suggestions use Elasticsearch completion suggesters. Pass completion fields, for example title.suggest.
  • Spelling suggestions use Elasticsearch term suggesters. Pass text fields, for example title.
  • Analytics processing is a safe no-op in this adaptor.

Credits

This module has taken inspiration following modules: