Einrichten einer Volltextsuche mit Scout in Laravel

Die Volltextsuche ist entscheidend, damit Benutzer auf inhaltsreichen Websites navigieren können. In diesem Beitrag zeige ich Ihnen, wie Sie die Volltextsuche für eine Laravel-App implementieren. Tatsächlich verwenden wir die Laravel Scout-Bibliothek, die die Implementierung der Volltextsuche einfach und spaßig macht.

Was genau ist der Laravel Scout? Die offizielle Dokumentation fasst es so zusammen:

Laravel Scout bietet eine einfache, treiberbasierte Lösung zum Hinzufügen von Volltextsuchen zu Ihren Eloquent-Modellen. Mit Modellbeobachtern hält Scout Ihre Suchindizes automatisch mit Ihren Eloquent-Datensätzen synchron.

Grundsätzlich handelt es sich bei Laravel Scout um eine Bibliothek, die die Manipulation des Index verwaltet, wenn sich Modelldaten ändern. Der Ort, an dem die Daten indiziert werden, hängt von dem Treiber ab, den Sie mit der Scout-Bibliothek konfiguriert haben.

Ab sofort unterstützt die Scout-Bibliothek Algolia, eine Cloud-basierte Suchmaschinen-API. In diesem Artikel werden wir die Implementierung der Volltextsuche demonstrieren.

Wir beginnen mit der Installation der Scout- und Algolia-Serverbibliotheken. Im weiteren Verlauf zeigen wir anhand eines Beispiels aus der Praxis, wie Sie Ihre Daten indizieren und durchsuchen können.

Serverkonfigurationen

In diesem Abschnitt werden wir die Abhängigkeiten installieren, die erforderlich sind, damit die Scout-Bibliothek mit Laravel funktioniert. Nach der Installation müssen wir einige Einstellungen vornehmen, damit Laravel die Scout-Bibliothek erkennen kann.

Gehen wir weiter und installieren Sie die Scout-Bibliothek mit Composer.

$ composer benötigen Laravel / Scout

Das ist so ziemlich alles, was die Installation der Scout-Bibliothek angeht. Nachdem wir nun die Scout-Bibliothek installiert haben, stellen wir sicher, dass Laravel davon weiß.

Wenn Sie mit Laravel arbeiten, kennen Sie wahrscheinlich das Konzept eines Service Providers, mit dem Sie Services in Ihrer Anwendung konfigurieren können. Wenn Sie also einen neuen Dienst in Ihrer Laravel-Anwendung aktivieren möchten, müssen Sie lediglich einen zugehörigen Diensteanbieter-Eintrag in der config / app.php.

Wenn Sie mit Laravel-Dienstanbietern noch nicht vertraut sind, würde ich Ihnen dringend empfehlen, sich selbst einen Gefallen zu tun und diesen einführenden Artikel durchzugehen, der die Grundlagen der Diensteanbieter in Laravel erläutert.

In unserem Fall müssen wir nur das hinzufügen ScoutServiceProvider der Liste der Diensteanbieter in config / app.php, wie im folgenden Ausschnitt gezeigt.

… 'Provider' => [/ * * Laravel Framework Service Provider… * / Illuminate \ Auth \ AuthServiceProvider :: Klasse, Beleuchtung \ Broadcasting \ BroadcastServiceProvider :: Klasse, Illuminate \ Bus \ BusServiceProvider :: Klasse, Illuminate \ Cache \ CacheServiceProvider: : Klasse, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: Klasse, Illuminate \ Cookie \ CookieServiceProvider :: Klasse, Illuminate \ Database \ DatabaseServiceProvider :: Klasse, Illuminate \ Encryption \ EncryptionServiceProvider :: Klasse, Illuminate \ Filesystem \ FilesystemServiceProvider :: Klasse, Illuminate \ Foundation \ Providers \ FoundationServiceProvider :: Klasse, Illuminate \ Hashing \ HashServiceProvider :: Klasse, Illuminate \ Mail \ MailServiceProvider :: Klasse, Illuminate \ Notifications \ NotificationServiceProvider :: Klasse, Illuminate \ Pagination \ PaginationServiceProvider :: Klasse, Illuminate \ Pipeline \ PipelineServiceProvider :: Klasse, Illuminate \ Queue \ QueueServiceProvider :: Klasse, Illuminate \ Redis \ RedisServiceProvider :: Klasse, Illuminate \ Auth \ Passwords \ PasswordResetServ iceProvider :: class, Illuminate \ Session \ SessionServiceProvider :: class, Illuminate \ Übersetzung \ TranslationServiceProvider :: class, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ View \ ViewServiceProvider :: class, / * * Paketdienstanbieter… * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Anwendungsdienstanbieter… * / App \ Providers \ AppServiceProvider :: class, App \ Providers \ AuthServiceProvider :: class, App \ Providers \ BroadcastServiceProvider :: class, App \ Providers \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class, Laravel \ Scout \ ScoutServiceProvider :: class,],… 

Nun weiß Laravel das ScoutServiceProvider Diensteanbieter. Die Scout-Bibliothek wird mit einer Konfigurationsdatei geliefert, mit der wir API-Berechtigungsnachweise festlegen können.

Machen wir weiter und veröffentlichen die von der Scout-Bibliothek bereitgestellten Assets mit dem folgenden Befehl.

$ php Kunsthandwerker: publish --provider = "Laravel \ Scout \ ScoutServiceProvider" Kopierte Datei [/vendor/laravel/scout/config/scout.php] In [/config/scout.php] Veröffentlichung abgeschlossen.

Wie Sie sehen können, hat es das kopiert vendor / laravel / scout / config / scout.php Datei in config / scout.php.

Als Nächstes erstellen Sie ein Konto bei Algolia, da wir zunächst API-Anmeldeinformationen benötigen. Nachdem Sie die API-Informationen erhalten haben, nehmen Sie die erforderlichen Einstellungen in der Anwendung vor config / scout.php Datei, wie im folgenden Snippet gezeigt.

 env ('SCOUT_DRIVER', 'algolia'), / * | -------------------------------- -------------------------------------- Index-Präfix | ------------------------------------------- --------------------------- | | Hier können Sie ein Präfix angeben, das auf alle Suchindex | angewendet wird Namen, die von Scout verwendet werden. Dieses Präfix kann nützlich sein, wenn Sie mehrere | "Mieter" oder Anwendungen, die dieselbe Suchinfrastruktur verwenden. | * / 'prefix' => env ('SCOUT_PREFIX', "), / * | --------------------------- --------------------------------------- | Warteschlangendaten-Synchronisierung | - -------------------------------------------------- ---------------------- | | Mit dieser Option können Sie steuern, ob die Vorgänge, mit denen Ihre Daten mit Ihren Suchmaschinen synchronisiert werden, in die Warteschlange gestellt werden "true", dann wird die automatische Datensynchronisierung in die Warteschlange gestellt, um eine bessere Leistung zu erzielen. | * / 'queue' => env ('SCOUT_QUEUE', false), / * | -------------- -------------------------------------------------- ---------- | Chunk-Größen | ------------------------------------ -------------------------------------- | | Mit diesen Optionen können Sie die maximale Blockgröße steuern Beim Massenimport von Daten in die Suchmaschine können Sie | jede dieser Chunk-Größen basierend auf der Leistung der Server optimieren. | * / 'chunk' => ['searchable' => 500, 'nicht durchsuchbar '=> 500,], / * | -------------------------------------- ---------------------------------- | Soft löscht | ------------------------------------------- --------------------------- | | Mit dieser Option können Sie steuern, ob weich gelöschte Datensätze in | aufbewahrt werden sollen die Suchindizes. Die Pflege gelöschter Datensätze kann | nützlich sein Wenn Ihre Anwendung später noch nach den Datensätzen suchen muss. | * / 'soft_delete' => false, / * | ---------------------------------- ------------------------------------ | Algolia-Konfiguration | ------------------------------------------- --------------------------- | | Hier können Sie Ihre Algolia-Einstellungen konfigurieren. Algolia ist eine gehostete Wolke Suchmaschine, die hervorragend mit Scout funktioniert. Einfach einstecken | in Ihrer Anwendungs-ID und Ihrem Admin-API-Schlüssel, um mit der Suche zu beginnen. | * / 'algolia' => ['id' => env ('ALGOLIA_APP_ID', 'STQK4DEGMA'), 'secret' => env ('ALGOLIA_SECRET', '6ef572194f70201ed7ad102cc9f90e05'),]];

Beachten Sie, dass wir den Wert von festgelegt haben SCOUT_DRIVER zu Algolia Treiber. Es ist daher erforderlich, dass Sie die erforderlichen Einstellungen für den Algolia-Treiber am Ende der Datei konfigurieren. Grundsätzlich müssen Sie nur das einstellen Ich würde und Geheimnis dass Sie aus dem Konto von Algolia haben.

Wie Sie sehen, holen wir Werte aus Umgebungsvariablen. Stellen wir also sicher, dass wir die folgenden Variablen in der .env Datei richtig.

… ALGOLIA_APP_ID = STQK4DEGMA ALGOLIA_SECRET = 6ef572194f70201ed7ad102cc9f90e05… 

Schließlich müssen wir das Algolia PHP SDK installieren, das für die Interaktion mit Algolia mithilfe von APIs verwendet wird. Installieren wir es mit dem Composer wie im folgenden Snippet gezeigt.

$ composer erfordert algolia / algoliasearch-client-php

Und damit haben wir alle Abhängigkeiten installiert, die erforderlich sind, um Daten an den Algolia-Dienst zu senden und zu indizieren.

Machen Sie Modelle indizierbar und durchsuchbar

Im vorigen Abschnitt haben wir alle harte Arbeit geleistet, um die Bibliotheken Scout und Algolia so einzurichten, dass wir mithilfe des Suchdienstes Algolia Daten indizieren und durchsuchen können.

In diesem Abschnitt wird ein Beispiel beschrieben, in dem gezeigt wird, wie Sie die vorhandenen Daten indizieren und Suchergebnisse aus Algolia abrufen können. Ich gehe davon aus, dass Sie einen Standard haben Post Modell in Ihrer Anwendung, die wir in unserem Beispiel verwenden werden.

Das erste, was wir tun müssen, ist das Hinzufügen von Laravel \ Scout \ Durchsuchbar Merkmal der Post Modell. Das macht das Post Modell durchsuchbar; Laravel synchronisiert Postdatensätze mit dem Algolia-Index, wenn der Postdatensatz hinzugefügt, aktualisiert oder gelöscht wird.

Damit das Post Modell ist suchfreundlich!

Als Nächstes möchten wir die Felder konfigurieren, die überhaupt indiziert werden sollen. Natürlich möchten Sie nicht alle Felder Ihres Modells in Algolia indexieren, um es effektiv und leicht zu halten. Tatsächlich werden Sie es meistens nicht brauchen.

Sie können das hinzufügen toSearchableArray in der Modellklasse, um die Felder zu konfigurieren, die indiziert werden sollen.

/ ** * Ruft das indexierbare Datenarray für das Modell ab. * * @return array * / public function toSearchableArray () $ array = $ this-> toArray (); return array ('id' => $ array ['id'], 'name' => $ array ['name']); 

Jetzt können wir vorhandene importieren und indizieren Post Aufzeichnungen in Algolia. Tatsächlich macht die Scout-Bibliothek dies mit dem folgenden Handwerkerbefehl einfach.

$ php Handwerker-Scout: Import "App \ Post"

Das sollte alle Datensätze der importieren Post Modell in einem Zug! Sie werden indiziert, sobald sie importiert werden. Wir können also bereits Datensätze abfragen. Sehen Sie sich das Algolia-Dashboard an, um die importierten Datensätze und andere Dienstprogramme anzuzeigen.

Wie es zusammen funktioniert

In diesem Abschnitt erstellen wir ein Beispiel, das zeigt, wie Such- und CRUD-Vorgänge ausgeführt werden, die in Echtzeit mit dem Algolia-Index synchronisiert werden.

Mach weiter und erstelle das app / HTTP / Controller / SearchController.php Datei mit folgendem Inhalt.

erhalten(); // mach das übliche hier foreach ($ posts as $ post) //… public function add () // Dieser Beitrag sollte sofort bei Algolia indiziert werden! $ post = neuer Beitrag; $ post-> setAttribute ('name', 'Another Post'); $ post-> setAttribute ('user_id', '1'); $ post-> save ();  public function delete () // Dieser Beitrag sollte in Algolia sofort aus dem Index entfernt werden! $ post = Post :: find (1); $ post-> delete (); 

Natürlich müssen wir auch die zugehörigen Routen hinzufügen.

Route :: get ('search / query', 'SearchController @ query'); Route :: get ('search / add', 'SearchController @ add'); Route :: get ('suchen / löschen', 'SearchController @ delete');

Lass uns durch gehen Abfrage Methode, um zu sehen, wie man in Algolia suchen kann.

public function query () // fragt den Algolia-Suchindex ab und gibt übereinstimmende Datensätze als eloquent models zurück. $ posts = Post :: search ('title') -> get (); // mach das übliche hier foreach ($ posts as $ post) //…

Erinnern wir uns, dass wir das gemacht haben Post Modell durchsuchbar durch Hinzufügen der Durchsuchbar Merkmal. Und so kam es dass der Post Modell kann die verwenden Suche Methode, um Datensätze aus dem Algolia-Index abzurufen. Im obigen Beispiel versuchen wir, Datensätze abzurufen, die mit dem übereinstimmen Titel Stichwort.

Als nächstes gibt es die hinzufügen Methode, die den Arbeitsablauf beim Hinzufügen eines neuen Postdatensatzes imitiert.

public function add () // Dieser Beitrag sollte sofort bei Algolia indiziert werden! $ post = neuer Beitrag; $ post-> setAttribute ('name', 'Another Post'); $ post-> setAttribute ('user_id', '1'); $ post-> save (); 

Der obige Code ist nichts Besonderes. es erstellt einfach einen neuen Post-Record mit der Post Modell. Aber die Post Modell implementiert die Durchsuchbar Charakteristikum, so dass Laravel diesmal zusätzliche Arbeit leistet, indem sie den neu erstellten Datensatz in Algolia indexiert. Wie Sie sehen, erfolgt die Indizierung in Echtzeit.

Endlich gibt es die löschen Methode. Lass es uns auch durchgehen.

public function delete () // Dieser Beitrag sollte in Algolia sofort aus dem Index entfernt werden! $ post = Post :: find (1); $ post-> delete (); 

Wie erwartet, wird der Datensatz sofort aus dem Algolia-Index gelöscht, sobald er aus der Datenbank gelöscht wird.

Grundsätzlich ist von Ihrer Seite kein zusätzlicher Aufwand erforderlich, wenn Sie vorhandene Modelle durchsuchbar machen möchten. Alles wird von der Scout-Bibliothek mit Modellbeobachtern gehandhabt.

Und das bringt uns auch zum Ende dieses Artikels!

Fazit

Heute haben wir besprochen, wie Sie die Volltextsuche in Laravel mithilfe der Laravel Scout-Bibliothek implementieren können. Dabei haben wir die notwendigen Installationen und ein Beispiel aus der realen Welt gezeigt, um dies zu demonstrieren.

Fühlen Sie sich frei, zu fragen, ob Sie Fragen oder Zweifel haben, indem Sie den Kommentar-Feed unten verwenden!