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.
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.
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 dedoorzoekbaar
eigenschap. Dus, dePost
model kan dezoeken
methode om records uit de Algolia-index op te halen. In het bovenstaande voorbeeld proberen we records op te halen die overeenkomen met detitel
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 dePost
model implementeert dedoorzoekbaar
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!