covertnija/elasticsearch-integration
Install & Configure
composer require covertnija/elasticsearch-integration
Update .env with your Elasticsearch hosts (CSV format):
ELASTICSEARCH_HOSTS=127.0.0.1:9200,127.0.0.2:9200
First Use Case: Querying Elasticsearch Inject the client in a service/controller:
use Covertnija\ElasticsearchIntegration\Client\ElasticsearchClientInterface;
class ProductSearchController
{
public function __construct(
private ElasticsearchClientInterface $elasticsearchClient
) {}
public function search(): void
{
$response = $this->elasticsearchClient->search([
'index' => 'products',
'body' => ['query' => ['match_all' => new \stdClass()]]
]);
// Process $response
}
}
Verify Configuration
Check config/packages/elasticsearch_integration.yaml for defaults and override as needed.
ElasticsearchClientInterface in any service/controller.cache:clear.ELASTICSEARCH_HOSTS in .env to add/remove nodes without code changes.@timestamp for direct ingestion into Kibana.# config/packages/elasticsearch_integration.yaml
elasticsearch_integration:
logging:
enabled: true
level: debug
%env(int:...%)% or %env(csv:...%)% for dynamic values.$this->container->setParameter('elasticsearch_integration.hosts', ['custom:host:9200']);
bulk() method for efficient indexing:
$this->elasticsearchClient->bulk([
'index' => 'products',
'body' => [
['index' => ['_id' => 1]],
['price' => 19.99],
['index' => ['_id' => 2]],
['price' => 29.99],
]
]);
ElasticsearchClientInterface in tests with a mock client.Connection Pooling:
$this->elasticsearchClient->getConnection()->close();
Host Format:
ELASTICSEARCH_HOSTS uses host:port format (e.g., 127.0.0.1:9200). Malformed entries will be skipped with a warning.Logging Overhead:
logging.enabled: false in config to reduce overhead if logs aren’t needed.Symfony Cache:
onKernelRequest).Elasticsearch Version:
Enable Debug Logging:
elasticsearch_integration:
logging:
level: debug
Check logs for connection attempts, failovers, and query details.
Check Host Normalization:
.env or config:
php bin/console debug:container elasticsearch_integration.client
Look for the hosts parameter in the output.Failover Debugging:
ELASTICSEARCH_HOSTS=badhost:9200,goodhost:9200 to test failover behavior.Custom Client Configuration:
ElasticsearchClientInterface:
services:
App\Service\CustomElasticsearchClient:
decorates: 'elasticsearch_integration.client'
Add Middleware:
$client->getConnection()->addMiddleware(function (Request $request, callable $next) {
$request->setHeader('X-Custom-Header', 'value');
return $next($request);
});
Custom Monolog Formatter:
monolog:
handlers:
elasticsearch:
type: service
id: App\Logger\CustomElasticsearchHandler
Health Checks:
use Symfony\Component\HealthCheck\HealthCheckInterface;
use Symfony\Component\HealthCheck\HealthResult;
class ElasticsearchHealthCheck implements HealthCheckInterface
{
public function check(HealthCheck $healthCheck): HealthResult
{
return $this->elasticsearchClient->ping()
? HealthResult::healthy()
: HealthResult::unhealthy('Elasticsearch unavailable');
}
}
Register it in config/services.yaml:
services:
Symfony\Component\HealthCheck\HealthCheck\ElasticsearchHealthCheck:
arguments:
$elasticsearchClient: '@elasticsearch_integration.client'
tags: ['health_check.check']
Bulk Indexing:
bulk() method for batch operations to minimize HTTP overhead.Connection Reuse:
Environment-Specific Config:
%kernel.environment% to switch configs:
elasticsearch_integration:
hosts: '%env(ELASTICSEARCH_HOSTS)%'
logging:
enabled: '%kernel.debug%'
Avoid Blocking Calls:
How can I help you explore Laravel packages today?