Slik setter du opp en fulltekstsøk med Scout i Laravel

Fulltekstsøk er avgjørende for at brukerne kan navigere på innholdsrike nettsteder. I dette innlegget vil jeg vise deg hvordan du implementerer fulltekstsøk for en Laravel-app. Faktisk bruker vi Laravel Scout-biblioteket, som gjør implementering av fulltekstsøk enkelt og morsomt.

Hva er Laravel Scout? Den offisielle dokumentasjonen oppsummerer det slik:

Laravel Scout gir en enkel, sjåførbasert løsning for å legge til fulltekstsøk i Eloquent-modellene dine. Ved hjelp av modellobservatører vil Scout automatisk holde søkeindeksene dine synkronisert med dine Eloquent-poster.

I utgangspunktet er Laravel Scout et bibliotek som styrer manipulering av indeksen når det er en endring i modelldataene. Stedet der dataene skal indekseres avhenger av driveren du har konfigurert med Scout-biblioteket.

Fra nå av støtter Scout-biblioteket Algolia, en skybasert søkemotor-API, og det er det vi skal bruke i denne artikkelen for å demonstrere fulltekstsøkingsimplementering.

Vi starter med å installere Scout og Algolia-serverbiblioteker, og når vi går videre, går vi gjennom et ekte eksempel for å demonstrere hvordan du kan indeksere og søke dataene dine.

Serverkonfigurasjoner

I denne delen skal vi installere de avhengighetene som kreves for å få Scout-biblioteket til å fungere sammen med Laravel. Etter installasjonen må vi gå gjennom en del konfigurasjoner slik at Laravel kan oppdage Scout-biblioteket.

La oss fortsette å installere Scout-biblioteket ved å bruke Komponist.

$ komponist krever laravel / speider

Det er ganske mye så langt som Scout-bibliotekets installasjon er opptatt av. Nå som vi har installert Scout-biblioteket, la oss sørge for at Laravel vet om det.

Arbeid med Laravel, du er sikkert klar over konseptet av en tjenesteleverandør, som lar deg konfigurere tjenester i søknaden din. Når du vil aktivere en ny tjeneste i Laravel-applikasjonen din, må du bare legge til en tilhørende tjenesteleverandørinngang i config / app.php.

Hvis du ikke er kjent med Laravel-tjenesteleverandører ennå, vil jeg sterkt anbefale at du gjør deg selv en tjeneste og gå gjennom denne innledende artikkelen som forklarer det grunnleggende om tjenesteleverandører i Laravel.

I vårt tilfelle trenger vi bare å legge til ScoutServiceProvider leverandør til listen over tjenesteleverandører i config / app.php, som vist i følgende utdrag.

... 'leverandører' => [/ * * Laravel Work Service Providers ... * / Illuminate \ Auth \ AuthServiceProvider :: klasse, Illuminate \ Broadcasting \ BroadcastServiceProvider :: klasse, Illuminate \ buss \ BusServiceProvider :: klasse, Illuminate \ Cache \ CacheServiceProvider: : klasse, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: klasse, Illuminate \ Cookie \ CookieServiceProvider :: klasse, Illuminate \ Database \ DatabaseServiceProvider :: klasse, Illuminate \ kryptering \ EncryptionServiceProvider :: klasse, Illuminate \ Filesystem \ FilesystemServiceProvider :: klasse, belyse \ Foundation \ Providers \ FoundationServiceProvider :: klasse, Illuminate \ Hashing \ HashServiceProvider :: klasse, Illuminate \ Mail \ MailServiceProvider :: klasse, Illuminate \ Meldinger \ NotificationServiceProvider :: klasse, Illuminate \ paginering \ PaginationServiceProvider :: klasse, Illuminate \ Pipeline \ PipelineServiceProvider :: Klasse, Lys \ Kjøre \ QueueServiceProvider :: Klasse, Lys \ Redis \ RedisServiceProvider :: Klasse, Lyser \ Auth \ Passord \ PasswordResetServ iceProvider :: class, Illuminate \ Session \ SessionServiceProvider :: klassen, Lyser \ Oversettelse \ OversettelseServiceProvider :: klasse, Lyser \ Validering \ ValidasjonServiceProvider :: klasse, Lyser \ Vis \ VisServiceProvider :: klasse, / * * Pakkeleverandører ... * / Laravel \ Tinker \ TinkerServiceProvider :: klasse, / * * Applikasjonsleverandører ... * / App \ Providers \ AppServiceProvider :: klasse, App \ Providers \ AuthServiceProvider :: klasse, App \ Providers \ BroadcastServiceProvider :: klasse, App \ Providers \ EventServiceProvider :: klasse, App \ Providers \ RouteServiceProvider :: klasse, Laravel \ Scout \ ScoutServiceProvider :: klasse,], ... 

Nå, Laravel er klar over ScoutServiceProvider tjenesteleverandør. Scout-biblioteket leveres med en konfigurasjonsfil som lar oss angi API-legitimasjon.

La oss gå videre og publisere eiendelene som tilbys av Scout-biblioteket ved hjelp av følgende kommando.

$ php artisan leverandør: publiser --provider = "Laravel \ Scout \ ScoutServiceProvider" Kopiert fil [/vendor/laravel/scout/config/scout.php] Til [/config/scout.php] Publisering er fullført.

Som du kan se, har den kopiert leverandør / laravel / speider / config / scout.php fil til config / scout.php.

Deretter går du videre og oppretter en konto hos Algolia, ettersom vi trenger API-legitimasjon i utgangspunktet. Når du har API-informasjonen, la oss gå videre og konfigurere de nødvendige innstillingene i config / scout.php fil, som vist i følgende utdrag.

 env ('SCOUT_DRIVER', 'algolia'), / * | ------------------------------------ -------------------------------------- | Indeksprefiks | ----------------------------------------------- --------------------------- | | Her kan du angi et prefiks som vil bli brukt på all søkeindeks | navn som brukes av Scout. Dette prefikset kan være nyttig hvis du har flere | "Leietakere" eller applikasjoner som deler samme søkeinfrastruktur. | * / 'prefix' => env ('SCOUT_PREFIX', "), / * | ------------------------------- ------------------------------------------- | Queue Data Syncing | - -------------------------------------------------- ---------------------- | | Dette alternativet lar deg kontrollere om operasjonene som synkroniserer dataene dine med søkemotorene er i kø. Når dette er satt til «true» da | alle automatiske datasynkronisering vil komme i kø for bedre ytelse. | * / 'queue' => env ('SCOUT_QUEUE', feil), / * | -------------- -------------------------------------------------- ---------- | Chunk Størrelser | ------------------------------------ -------------------------------------- | | Disse alternativene gir deg mulighet til å styre maksimalt stykkstørrelse når du er | masse import av data i søkemotoren. Dette gjør at du kan finjustere hver av disse størrelsestykkene basert på serverens kraft. | * / 'chunk' => ['searchable' => 500, 'unsearchable '=> 500,], / * | ---------------------------------------- ---------------------------------- | Myke sletter | ----------------------------------------------- --------------------------- | | Dette alternativet lar deg kontrollere om du vil beholde myke slettede poster i | søkeindeksene. Opprettholde myke slettede poster kan være nyttig | hvis søknaden din fortsatt trenger å søke etter postene senere. | * / 'soft_delete' => false, / * | -------------------------------------- ------------------------------------ | Algolia-konfigurasjon | ----------------------------------------------- --------------------------- | | Her kan du konfigurere Algolys innstillinger. Algolia er en sky vert | søkemotor som fungerer bra med speider ut av boksen. Bare plugg | i applikasjons-ID og admin-API-nøkkelen for å komme i gang med å søke. | * / 'algolia' => ['id' => env ('ALGOLIA_APP_ID', 'STQK4DEGMA'), 'hemmelig' => env ('ALGOLIA_SECRET', '6ef572194f70201ed7ad102cc9f90e05')]];

Vær oppmerksom på at vi har satt verdien av SCOUT_DRIVER til algolia sjåfør. Dermed er det nødvendig at du konfigurerer de nødvendige innstillingene for Algolia-driveren på slutten av filen. I utgangspunktet trenger du bare å sette id og hemmelig som du har fra Algolia-kontoen.

Som du ser, henter vi verdier fra miljøvariabler. Så la oss sørge for at vi stiller følgende variabler i .env fil riktig.

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

Endelig trenger vi å installere Algolia PHP SDK, som vil bli brukt til å samhandle med Algolia ved hjelp av APIer. La oss installere den ved hjelp av komponisten som vist i følgende utdrag.

$ komponist krever algolia / algoliasearch-client-php

Og med det har vi installert alle de avhengighetene som er nødvendige for å poste og indeksere data til Algolytjenesten.

Lag modeller som kan indekseres og søkes

I den forrige delen gjorde vi alt det harde arbeidet med å sette opp Scout og Algolia-bibliotekene, slik at vi kunne indeksere og søke data ved hjelp av Algolys søketjeneste.

I dette avsnittet går vi gjennom et eksempel som viser hvordan du kan indeksere eksisterende data og hente søkeresultater fra Algolia. Jeg antar at du har en standard Post modell i søknaden din som vi skal bruke i vårt eksempel.

Det første vi må gjøre er å legge til Laravel \ Scout \ Søkbar trekk til Post modell. Det gjør det Post modell søkbar; Laravel synkroniserer postoppføringer med Algolia-indeksen hver gang posten blir lagt til, oppdatert eller slettet.

Med det, Post modellen er søkevennlig!

Deretter ønsker vi å konfigurere feltene som skal bli indeksert i utgangspunktet. Selvfølgelig vil du ikke indeksere alle feltene i modellen din i Algolia for å holde den effektiv og lett. Faktisk, oftere enn ikke, trenger du ikke det.

Du kan legge til toSearchableArray i modellklassen for å konfigurere feltene som skal indekseres.

/ ** * Få indeksable data array for modellen. * * @return array * / offentlig funksjon toSearchableArray () $ array = $ this-> toArray (); returnere array ('id' => $ array ['id'], 'navn' => $ array ['navn']); 

Nå er vi klare til å importere og indeksere eksisterende Post poster i Algolia. Faktisk gjør Scout-biblioteket det enkelt ved å gi følgende artisan-kommando.

$ php artisan scout: import "App \ Post"

Det skal importere alle postene til Post modell på en gang! De er indeksert så snart de er importert, så vi er klare til å spørre poster allerede. Gå videre og undersøk Algolys dashboard for å se importerte poster og andre verktøy.

Slik fungerer det helt

I dette avsnittet oppretter vi et eksempel som viser hvordan du utfører søk og CRUD-operasjoner som synkroniseres i sanntid med Algolia-indeksen.

Gå videre og opprett app / Http / kontrollere / SearchController.php fil med følgende innhold.

få(); // gjør de vanlige tingene her forever ($ innlegg som $ post) // ... offentlig funksjon legg til () // dette innlegget bør indekseres i Algolia med en gang! $ post = nytt innlegg; $ post-> setAttribute ('name', 'Another Post'); $ post-> setAttribute ('user_id', '1'); $ Post-> Lagre ();  Offentlig funksjon slett () // dette innlegget bør fjernes fra indeksen i Algolia med en gang! $ post = Post :: finn (1); $ Post-> slett (); 

Selvfølgelig må vi også legge til de tilknyttede rutene.

Rute :: få ('søk / spørring', 'SearchController @ spørring'); Rute :: få ('søk / legg til', 'SearchController @ add'); Rute :: få ('søk / slett', 'SearchController @ delete');

La oss gå gjennom spørsmål metode for å se hvordan å utføre et søk i Algolia.

Offentlig funksjon spørring () // spørringer til Algolia søkeindeks og returnerer matchede poster som Eloquent Modeller $ posts = Post :: søk ('title') -> get (); // gjør de vanlige tingene her forever ($ innlegg som $ post) // ...

Husk at vi laget Post modell søkbar ved å legge til søkbar trekk. Dermed er Post modell kan bruke Søke Metode for å hente poster fra Algolia-indeksen. I eksemplet ovenfor prøver vi å hente poster som samsvarer med tittel søkeord.

Deretter er det Legg til Metode som etterligner arbeidsflyten ved å legge til en ny postrekord.

offentlig funksjon legg til () // dette innlegget bør indekseres i Algolia med en gang! $ post = nytt innlegg; $ post-> setAttribute ('name', 'Another Post'); $ post-> setAttribute ('user_id', '1'); $ Post-> Lagre (); 

Det er ikke noe fancy i ovennevnte kode; det skaper bare en ny postrekord ved hjelp av Post modell. Men Post modellen implementerer søkbar egenskap, så Laravel gjør litt ekstra arbeid denne gangen ved å indeksere den nyopprettede posten i Algolia. Så som du kan se, er indekseringen gjort i sanntid.

Til slutt er det slette metode. La oss også gå gjennom det.

offentlig funksjon slette () // dette innlegget bør fjernes fra indeksen i Algolia med en gang! $ post = Post :: finn (1); $ Post-> slett (); 

Som du ville ha forventet, blir platen slettet med en gang fra Algolia-indeksen så snart den er slettet fra databasen.

I utgangspunktet trenger du ingen ekstra innsats fra din side hvis du vil gjøre eksisterende modeller søkbare. Alt håndteres av Scout-biblioteket ved hjelp av modellobservatører.

Og det bringer oss også til slutten av denne artikkelen!

Konklusjon

I dag diskuterte vi hvordan du kan implementere fulltekstsøk i Laravel ved hjelp av Laravel Scout-biblioteket. I prosessen gikk vi gjennom de nødvendige installasjonene og et ekteeksempel for å demonstrere det.

Du er velkommen til å spørre om du har spørsmål eller tvil ved å bruke kommentaren feed nedenfor!