Een zoekopdracht in volledige tekst instellen met Scout in Laravel

Zoeken in volledige tekst is van cruciaal belang om gebruikers in staat te stellen om door inhoud rijke websites te navigeren. In dit bericht laat ik je zien hoe je fulltext-zoekopdrachten kunt uitvoeren voor een Laravel-app. In feite zullen we de Laravel Scout-bibliotheek gebruiken, wat de implementatie van zoeken in volledige tekst eenvoudig en leuk maakt.

Wat is de Laravel Scout precies? De officiële documentatie vat het als volgt samen:

Laravel Scout biedt een eenvoudige, op stuurprogramma's gebaseerde oplossing voor het toevoegen van full-text-zoekopdrachten aan uw Eloquent-modellen. Met behulp van modelwaarnemers houdt Scout automatisch uw zoekindexen gesynchroniseerd met uw Eloquent-records.

In principe is Laravel Scout een bibliotheek die de manipulatie van de index beheert telkens wanneer er een wijziging in de modelgegevens optreedt. De plaats waar de gegevens worden geïndexeerd, is afhankelijk van het stuurprogramma dat u hebt geconfigureerd met de Scout-bibliotheek.

Vanaf nu ondersteunt de Scout-bibliotheek Algolia, een cloud-gebaseerde zoekmachine-API, en dat is wat we in dit artikel zullen gebruiken om de volledige tekstzoekimplementatie aan te tonen.

We beginnen met het installeren van de Scout- en Algolia-serverbibliotheken en naarmate we verdergaan zullen we een realistisch voorbeeld nemen om te laten zien hoe u uw gegevens kunt indexeren en doorzoeken.

Serverconfiguraties

In deze sectie gaan we de afhankelijkheden installeren die nodig zijn om de Scout-bibliotheek met Laravel te laten werken. Na de installatie zullen we een behoorlijk aantal configuraties moeten doorlopen zodat Laravel de Scout-bibliotheek kan detecteren.

Laten we doorgaan en de Scout-bibliotheek installeren met Composer.

$ componist vereist laravel / scout

Dat is ongeveer zover als de installatie van de Scout-bibliotheek. Nu we de Scout-bibliotheek hebben geïnstalleerd, zorgen we ervoor dat Laravel hiervan op de hoogte is.

In samenwerking met Laravel bent u waarschijnlijk op de hoogte van het concept van een serviceprovider, waarmee u services in uw toepassing kunt configureren. Wanneer u dus een nieuwe service in uw Laravel-toepassing wilt inschakelen, hoeft u alleen maar een bijbehorende serviceprovideritem toe te voegen in de config / app.php.

Als u nog niet bekend bent met Laravel-serviceproviders, zou ik u ten zeerste aanraden om uzelf een plezier te doen en dit inleidende artikel met de basisprincipes van serviceproviders in Laravel te bespreken..

In ons geval hoeven we alleen de. Toe te voegen ScoutServiceProvider provider naar de lijst met serviceproviders in config / app.php, zoals getoond in het volgende fragment.

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

Nu is Laravel op de hoogte van de ScoutServiceProvider serviceprovider. De Scout-bibliotheek wordt geleverd met een configuratiebestand waarmee we API-inloggegevens kunnen instellen.

Laten we doorgaan en de door de Scout-bibliotheek geleverde middelen publiceren met behulp van de volgende opdracht.

$ php artisan vendor: publish --provider = "Laravel \ Scout \ ScoutServiceProvider" Gekopieerd bestand [/vendor/laravel/scout/config/scout.php] Naar [/config/scout.php] Publiceren voltooid.

Zoals je kunt zien, heeft het de verkoper / laravel / scout / config / scout.php bestand naar config / scout.php.

Ga vervolgens verder en maak een account aan bij Algolia omdat we in de eerste plaats API-inloggegevens nodig hebben. Zodra u de API-informatie heeft, gaan we door en configureren de noodzakelijke instellingen in de config / scout.php bestand, zoals getoond in het volgende fragment.

 env ('SCOUT_DRIVER', 'algolia'), / * | ------------------------------------ -------------------------------------- | Voorvoegsel index | ----------------------------------------------- --------------------------- | | Hier kunt u een voorvoegsel opgeven dat wordt toegepast op alle zoekindex | namen gebruikt door Scout. Dit voorvoegsel kan handig zijn als u meerdere | "huurders" of applicaties die dezelfde zoekinfrastructuur delen. | * / 'prefix' => env ('SCOUT_PREFIX', "), / * | ------------------------------- ------------------------------------------- | Gegevens synchroniseren in wachtrij | - -------------------------------------------------- ---------------------- | | Met deze optie kunt u bepalen of de bewerkingen waarmee uw gegevens worden gesynchroniseerd met uw zoekmachines in de wachtrij staan. "true" dan | alle automatische gegevenssynchronisatie wordt in de wachtrij geplaatst voor betere prestaties. * / 'queue' => env ('SCOUT_QUEUE', false), / * | -------------- -------------------------------------------------- ---------- | Chunk Sizes | ------------------------------------ -------------------------------------- | | Met deze opties kunt u de maximale chunk-grootte bepalen wanneer u massa-importeert in de zoekmachine, kunt u elk van deze brokgroottes verfijnen op basis van de kracht van de servers. * / 'chunk' => ['doorzoekbaar' => 500, 'ondoorzoekbaar '=> 500,], / * | ---------------------------------------- ---------------------------------- | Soft Deletes | ----------------------------------------------- --------------------------- | | Met deze optie kunt u bepalen of soft deleted records in | de zoekindexen. Het onderhouden van zachte verwijderde records kan handig zijn als uw toepassing later nog naar de records moet zoeken. | * / 'soft_delete' => false, / * | -------------------------------------- ------------------------------------ | Algolia-configuratie | ----------------------------------------------- --------------------------- | | Hier kunt u uw Algolia-instellingen configureren. Algolia is een gehoste cloud | zoekmachine die geweldig werkt met Scout uit de doos. Sluit gewoon | in uw applicatie-ID en admin API-sleutel om aan de slag te gaan. | * / 'algolia' => ['id' => env ('ALGOLIA_APP_ID', 'STQK4DEGMA'), 'secret' => env ('ALGOLIA_SECRET', '6ef572194f70201ed7ad102cc9f90e05'),],];

Merk op dat we de waarde van hebben ingesteld SCOUT_DRIVER naar algolia bestuurder. Daarom is het vereist dat u de noodzakelijke instellingen voor het Algolia-stuurprogramma aan het einde van het bestand configureert. Kortom, je hoeft alleen maar de ID kaart en geheim die je hebt van het Algolia-account.

Zoals je ziet, halen we waarden op uit omgevingsvariabelen. Dus laten we ervoor zorgen dat we de volgende variabelen in de .env bestand correct.

... ALGOLIA_APP_ID = STQK4DEGMA ALGOLIA_SECRET = 6ef572194f70201ed7ad102cc9f90e05 ... 

Ten slotte moeten we de Algolia PHP SDK installeren, die zal worden gebruikt voor interactie met de Algolia met behulp van API's. Laten we het installeren met behulp van de composer zoals getoond in het volgende fragment.

$ composer vereist algolia / algoliasearch-client-php

En daarmee hebben we alle afhankelijkheden geïnstalleerd die nodig zijn om gegevens naar de Algolia-service te posten en te indexeren.

Maak modellen indexeerbaar en doorzoekbaar

In het vorige gedeelte hebben we al het harde werk gedaan om de Scout- en Algolia-bibliotheken in te stellen, zodat we gegevens konden indexeren en doorzoeken met behulp van de Algolia-zoekservice.

In deze sectie bespreken we een voorbeeld van hoe u de bestaande gegevens kunt indexeren en zoekresultaten van Algolia kunt ophalen. Ik neem aan dat je een standaard hebt Post model in uw toepassing dat we in ons voorbeeld zullen gebruiken.

Het eerste dat we moeten doen is het toevoegen van de Laravel \ Scout \ doorzoekbare trek naar de Post model. Dat maakt het Post model doorzoekbaar; Laravel synchroniseert postrecords met de Algolia-index telkens wanneer de postrecord wordt toegevoegd, bijgewerkt of verwijderd.

Met dat, de Post model is zoekvriendelijk!

Vervolgens willen we de velden configureren die in de eerste plaats moeten worden geïndexeerd. Natuurlijk wilt u niet alle velden van uw model in Algolia indexeren om het effectief en lichtgewicht te houden. Sterker nog, vaker wel dan niet, heb je het niet nodig.

U kunt de toSearchableArray in de modelklasse om de velden te configureren die worden geïndexeerd.

/ ** * Download de indexeerbare gegevensmatrix voor het model. * * @return array * / public function toSearchableArray () $ array = $ this-> toArray (); return array ('id' => $ array ['id'], 'name' => $ array ['name']); 

Nu zijn we klaar om te importeren en te indexeren Post records in Algolia. In feite maakt de Scout-bibliotheek dit gemakkelijk door de volgende artisan-opdracht te geven.

$ php artisan scout: importeer "App \ Post"

Dat zou alle records van de Post model in één keer! Ze worden geïndexeerd zodra ze worden geïmporteerd, dus we zijn al klaar om records te zoeken. Ga je gang en verken het Algolia-dashboard om de geïmporteerde records en andere hulpprogramma's te bekijken.

Hoe het werkt Alles samen

In deze sectie maken we een voorbeeld dat laat zien hoe u zoek- en CRUD-bewerkingen uitvoert die in realtime worden gesynchroniseerd met de Algolia-index.

Ga je gang en maak de app / Http / Controllers / SearchController.php bestand met de volgende inhoud.

krijgen(); // doe hier de gebruikelijke dingen foreach ($ posts als $ post) // ... public function add () // deze post moet meteen in Algolia worden geïndexeerd! $ post = nieuwe post; $ post-> setAttribute ('name', 'Another Post'); $ post-> setAttribute ('user_id', '1'); $ Post-> save ();  public function delete () // dit bericht moet meteen uit de index in Algolia worden verwijderd! $ post = Post :: find (1); $ Post-> delete (); 

Natuurlijk moeten we ook de bijbehorende routes toevoegen.

Route :: get ('search / query', 'SearchController @ query'); Route :: get ('zoeken / toevoegen', 'SearchController @ toevoegen'); Route :: get ('zoeken / verwijderen', 'SearchController @ verwijderen');

Laten we door de vraag methode om te zien hoe een zoekopdracht in Algolia moet worden uitgevoerd.

openbare functiequery () // query's naar Algolia-zoekindex en retourneert gekoppelde records als Eloquent Models $ posts = Post :: search ('title') -> get (); // doe de gebruikelijke dingen hier voor elk ($ berichten als $ bericht) // ...

Bedenk dat we de Post model doorzoekbaar door toevoeging van de doorzoekbaar eigenschap. Dus, de Post model kan de zoeken methode om records uit de Algolia-index op te halen. In het bovenstaande voorbeeld proberen we records op te halen die overeenkomen met de titel trefwoord.

Vervolgens is er de toevoegen methode die de workflow van het toevoegen van een nieuw postrecord imiteert.

public function add () // dit bericht moet meteen in Algolia worden geïndexeerd! $ post = nieuwe post; $ post-> setAttribute ('name', 'Another Post'); $ post-> setAttribute ('user_id', '1'); $ Post-> save (); 

Er is niets speciaals in de bovenstaande code; het maakt gewoon een nieuw postrecord aan met behulp van de Post model. Maar de Post model implementeert de doorzoekbaar eigenschap, dus Laravel doet dit keer wat extra werk door het nieuw gecreëerde record in Algolia te indexeren. Zoals u kunt zien, gebeurt het indexeren in realtime.

Eindelijk is er de verwijderen methode. Laten we er ook doorheen gaan.

openbare functie verwijderen () // deze post moet meteen uit de index in Algolia worden verwijderd! $ post = Post :: find (1); $ Post-> delete (); 

Zoals u had kunnen verwachten, wordt het record direct uit de Algolia-index verwijderd zodra het uit de database wordt verwijderd.

Kortom, er is geen extra inspanning vereist van uw kant als u bestaande modellen doorzoekbaar wilt maken. Alles wordt afgehandeld door de Scout-bibliotheek met behulp van modelwaarnemers.

En dat brengt ons ook tot het einde van dit artikel!

Conclusie

Vandaag hebben we besproken hoe u het zoeken in de volledige tekst in Laravel kunt implementeren met behulp van de Laravel Scout-bibliotheek. Tijdens dit proces hebben we de nodige installaties en een realistisch voorbeeld doorlopen om het te demonstreren.

Aarzel niet om te vragen of u vragen of twijfels hebt met behulp van de commentaarfeed hieronder!