In this tutorial, we will look at how to configure multiple search drivers in Laravel. As anyone familiar with Laravel knows, Algolia is the officially supported search driver, it is the only search engine that ships out of the box with Laravel scout.
However, because Algolia can get pretty expensive, we mostly turn to other free alternatives till it is absolutely required to use Algolia.
Assumptions:
This is not a from-the-scratch tutorial so here are a couple of assumptions I am making:
- You have built/curently building an app with the Laravel framework.
- You already have scout installed and most likely have one search driver currently set up. If not, checkout the documentation on how to do this
Scenario:
You want to reduce your cost to the barest minimum by using Algolia for specific models with expensive search operations while the remaining models use the free alternative you have setup.
- Install algolia sdk via composer
composer require algolia/algoliasearch-client-php:^2.2
- Add your app_id and secret to the .env file. To get this, login to your algolia account, go to API Keys and copy your application id and admin api key so you have something like this in your .env file
...
ALGOLIA_APP_ID=<application id>
ALGOLIA_SECRET=<admin api key>
...
- Configure algolia in your scout.php file:
'algolia' => [
'id' => env('ALGOLIA_APP_ID', ''),
'secret' => env('ALGOLIA_SECRET', ''),
],
and also make sure the other search driver you have setup is your default e.g.
'driver' => mysql
- Configure algolia for a particular model:
Laravel scout has a searchableUsing()
method which is responsible for getting the appropriate scout engine for the model and this is what we'll be overriding.
Right now, you can check the scout engine a model uses using artisan tinker like so:
Run
php artisan tinker
then
App\Models\Patient::first()->searchableUsing()
in my case, it returns
DamianTW\MySQLScout\Engines\MySQLEngine
which is the engine I am currently using.
Now we have that confirmed, we can go ahead to override the method
public function searchableUsing()
{
return app(EngineManager::class)->engine('algolia');
}
The algolia
in this case is from the engine we setup in our scout.php file i.e. the name we put in our engine must match what's stated in the scout config file. To avoid mistakes, we can add this to a constants file or a .env then pick from there.
You can verify that the override was successful by checking as we did earlier with the tinker environment.
So you can go ahead to (re)import your records and everything should work as normal.
Top comments (0)