somardigital / silverstripe-discoverer-elasticsearch
Elasticsearch adaptor for silverstripe/silverstripe-discoverer
Package info
github.com/somardigital/silverstripe-discoverer-elasticsearch
Type:silverstripe-vendormodule
pkg:composer/somardigital/silverstripe-discoverer-elasticsearch
Requires
- php: ^8.3
- elasticsearch/elasticsearch: ^9
- guzzlehttp/guzzle: ^7.9
- silverstripe/framework: ^6
- silverstripe/silverstripe-discoverer: ^3.1
Requires (Dev)
- phpunit/phpunit: ^11.3
- slevomat/coding-standard: ~8.18.0
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 nestedboolqueries. - Facets are translated to Elasticsearch
termsandrangeaggregations. - 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: