Published 3 years ago.

Author Peter Steenbergen

Hi, this is the first of many blog posts in a series of using Elasticsearch with Laravel.

In this article my focus is to setup a blank Laravel project and install the official Elasticsearch php package and hooking it into a Service Provider so we can change the environment later in production without changing the code itself.

Create a new laravel project

laravel new laravelelastic

Adding Elasticsearch repository

Now in the project folder add the composer package to the Application.

cd laravelelastic
composer require elasticsearch/elasticsearch

Setting up the Service Provider

Now that the Elasticsearch package is installed we can setup a connection through a Service Provider. So when a class needs the Elastic/Client's class we generate a Client using the ClientBuilder and add our configuration to the service provider.

We will start by creating a config file for elasticsearch at config/elasticsearch.php.

<?php

return [
    'hosts' => [
        [
            'host' => env('ELASTICSEARCH_HOST', 'localhost'),
            'user' => env('ELASTICSEARCH_USER', ''),
            'pass' => env('ELASTICSEARCH_PASS', ''),
        ],
    ],
];

We want to ingest this configuration through the AppServiceProvider. Open app/Providers/AppServiceProvider.php and set the contents to:

<?php

namespace App\Providers;

use Elasticsearch\Client;
use Elasticsearch\ClientBuilder;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(Client::class, function () {
            return ClientBuilder::create()
                ->setHosts(config('elasticsearch.hosts'))
                ->build();
        });
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

Testing the connection

Let's play some ping-pong shall we? If we send a ping to elasticsearch to see if the service is running keep we should output "pong".

First we will make a command in our Application.

php artisan make:command ElasticsearchPing

Open the file and add the following contents.

<?php

namespace App\Console\Commands;

use Elasticsearch\Client;
use Illuminate\Console\Command;

class ElasticsearchPing extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'elasticsearch:ping';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Ping Elasticsearch';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * @param Client $client
     */
    public function handle(Client $client)
    {
        if ($client->ping()) {
            $this->info('pong');
            return;
        }

        $this->error('Could not connect to Elasticsearch.');
    }
}

If all went well the output of the following command should be "pong".

php artisan elasticsearch:ping

Closing

So we now have a Laravel Project up and running with the latest Elasticsearch Client. Our next blog post will be setting up an index and attach some models to it.