Suchen mit Laravel

Headerfoto

 

Als umfangreiches PHP-Framework bringt Laravel natürlich auch eine Such-Engine mit: Scout. Die Basis-Installation läuft dabei in wenigen Schritten ab und schon hat man eine solide Basis-Such-Funktion für seine Applikation.

Scout installieren

Als erstes müssen wir Scout mittels des Composer Package Managers unserer Laravel-Installation hinzufügen:

composer require laravel/scout

Anschließend noch die Konfiguration laden:

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider" 

TNTSearch Driver installieren 

Zusätzlich zu Scout benötigen wir noch einen Such-Indexer, bzw. Driver. Hier empfehle ich den TNTSearch Driver, da dieser kostenlos zur Verfügung steht. Es gibt natürlich auch andere, z.B. Algolia, welche jedoch eigens erworben werden müssen. Wir installieren den TNTSearch Driver wieder mit Composer via:

composer require teamtnt/laravel-scout-tntsearch-driver

Anschließend fügen wir die beiden service provider unserer app.php im config-Verzeichnis hinzu:

'providers' => [
      //...
      TeamTNT\Scout\TNTSearchScoutServiceProvider::class,
      Laravel\Scout\ScoutServiceProvider::class,
],

Im nächsten Schritt müssen wir Scout noch mitteilen, welcher Driver verwendet werden soll. Dazu bearbeiten wir unsere .env-Datei und fügen folgendes hinzu:

SCOUT_DRIVER=tntsearch 

Abschließend ergänzen wir die scout.php im config-Verzeichnis noch um die zusätzliche Driver-Konfiguration:

 'tntsearch' => [
    'storage'  => storage_path('app/search'), 
    'fuzziness' => env('TNTSEARCH_FUZZINESS', false),
    'fuzzy' => [
        'prefix_length' => 2,
        'max_expansions' => 50,
        'distance' => 2
    ],
    'asYouType' => false,
    'searchBoolean' => env('TNTSEARCH_BOOLEAN', false),
],

Eventuell ändert ihr euren "storage_path" noch auf einen individuellen Pfad; hier wird der Such-Index abgelegt.

Suche verwenden

Damit nun eure Modelle durchsuchbar werden, müsst ihr euer Model wie folgt abändern:

namespace App;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;

class Produkt extends Model
{
      use Searchable;
      // ...
}

Sind alle Modelle entsprechend angepasst, dann könnt ihr die vorhandenen mittels folgenden Befehls indizieren:

php artisan scout:import App\\Produkt 

Später hinzukommende Modelle werden automatisch beim Aufruf der save() oder update()-Funktion dem Index hinzugefügt!

Suche starten

Sind alle eure Modelle angepasst, könnt ihr nun ein Formular für die Suche anlegen. Diese wird dann einem Controller übergeben, welche wie folgt nun nach entsprechenden Modellen sucht:

$produkte = Produkt::search('Apfel')->get(); 

Die gefundenen Produkte könnt ihr anschließend nun auf einer Such-Ergebnisse-Seite ausgeben.

Ihr könnt die search()-Funktion natürlich mit where() und orderBy() entsprechend kombinieren.
Weitere Infos findet ihr unter: https://laravel.com/docs/5.6/scout