Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/james2doyle/laravel-scout-sonic
Sonic driver for Laravel Scout
https://github.com/james2doyle/laravel-scout-sonic
laravel scout search sonic
Last synced: 2 months ago
JSON representation
Sonic driver for Laravel Scout
- Host: GitHub
- URL: https://github.com/james2doyle/laravel-scout-sonic
- Owner: james2doyle
- License: mit
- Created: 2019-04-07T23:19:37.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2020-11-13T19:48:03.000Z (about 4 years ago)
- Last Synced: 2024-04-25T04:42:28.606Z (9 months ago)
- Topics: laravel, scout, search, sonic
- Language: PHP
- Size: 24.4 KB
- Stars: 53
- Watchers: 6
- Forks: 7
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
Laravel Scout Sonic Driver
==========================Search Eloquent Models using [Sonic](https://github.com/valeriansaliou/sonic) indexes.
1. [Implementation](#implementation)
2. [Installation](#installation)
3. [Usage](#usage)Implementation
-------------When implementing the `toSearchableArray` method, you need to provide an array that will be coerced into a string (the engine just joins with a `' '`) as Sonic can only index strings. So you need to provide a "stringified" (index string) version of your model. The default `toArray` works but it is probably too much noise for reasonable usage.
Here is an example of the string I used when I was developing this Engine:
```php
public function toSearchableArray()
{
return array_filter([$this->display_name, $this->first_name, $this->last_name]);
}
```For me, this builds a nice string for search that can match on a "name". In my application, the concept of "name" is either the User display name or first/last name.
---
If the locale is known, you can also create the `getSonicLocale()` method on your model, which returns the locale. It will then get passed to the Sonic `PUSH` calls:
```php
// an ISO 639-3 locale code eg. eng for English (if set, the locale must be a valid ISO 639-3 code; if set to none, lexing will be disabled; if not set, the locale will be guessed from text)
public function getSonicLocale() {
return 'none';
}
```Installation
------------If you haven't already you should [install Laravel Scout](https://laravel.com/docs/5.8/scout#installation) to
your project and apply the `Laravel\Scout\Searchable` trait to any Eloquent models you would like to make searchable.Install this package via **Composer**
`composer require james2doyle/laravel-scout-sonic`
**Note: if you have Laravel >= 5.5 you can skip this step because of Package Auto-Discovery.**
Next add the ServiceProvider to the Package Service Providers in `config/app.php`
```php
/*
* Package Service Providers...
*/
james2doyle\SonicScout\Providers\SonicScoutServiceProvider::class,
```Append the default configuration to `config/scout.php`
```php
/*
|--------------------------------------------------------------------------
| Sonic Configuration
|--------------------------------------------------------------------------
|
| Here you may configure your Sonic settings.
|
*/'sonic' => [
'address' => \env('SONIC_ADDRESS', 'localhost'),
'port' => \env('SONIC_PORT', 1491),
'password' => \env('SONIC_PASSWORD'),
'connection_timeout' => \env('SONIC_CONNECTION_TIMEOUT', 10),
'read_timeout' => \env('SONIC_READ_TIMEOUT', 5)
],
```Set `SCOUT_DRIVER=sonic` in your `.env` file
In addition there is no need to use the `php artisan scout:import` command.
Usage
-----Simply call the `search()` method on your `Searchable` models:
`$users = App\User::search('bro')->get();`
Simple constraints can be applied using the `where()` builder method:
`$users = App\User::search('bro')->where('active', 1)->get();`
**Note: Sonic does not support the concept of "where", so the where is applied at the collection level not the query!**
### Pagination
Sonic cannot support real pagination because Sonic does not return proper paging or total information. It simply returns all the results for a given query.
There is a naive implementation of pagination in place but it probably isn't perfect as it doesn't take into account the "where" filter.
For more usage information see the [Laravel Scout Documentation](https://laravel.com/docs/5.3/scout).