Cum se configurează o căutare completă a textului folosind Scout în Laravel

Căutarea pe întregul text este crucială pentru a permite utilizatorilor să navigheze pe site-uri bogate în conținut. În acest post, vă voi arăta cum să implementați căutarea full-text pentru o aplicație Laravel. De fapt, vom folosi biblioteca Laravel Scout, care face ca implementarea căutării în text întreg să fie simplă și distractivă.

Ce anume este cercetarea Laravel? Documentația oficială o însumează astfel:

Laravel Scout oferă o soluție simplă, bazată pe șofer, pentru a adăuga o căutare completă la modelele dvs. Eloquent. Folosind observatori de model, Scout va păstra automat sincronizarea indexurilor dvs. de căutare cu înregistrările dvs. Eloquent.

Practic, Laravel Scout este o bibliotecă care gestionează manipularea indexului ori de câte ori există o schimbare în datele modelului. Locul unde vor fi indexate datele depinde de driverul pe care l-ați configurat cu biblioteca Scout.

Până acum, biblioteca Scout susține Algolia, un API pentru motoare de căutare bazate pe cloud, și asta vom folosi în acest articol pentru a demonstra implementarea de căutare fulltext.

Vom începe prin instalarea bibliotecilor de servere Scout și Algolia și, pe măsură ce vom trece mai departe, vom trece printr-un exemplu din lumea reală pentru a demonstra cum puteți indexa și căuta datele dvs..

Configurații server

În această secțiune, vom instala dependențele necesare pentru ca biblioteca Scout să lucreze cu Laravel. După instalare, va trebui să trecem printr-o configurație destul de mare, astfel încât Laravel să poată detecta biblioteca Scout.

Să mergem mai departe și să instalăm biblioteca Scout utilizând Composer.

Compozitorul $ necesită laravel / scout

Asta este destul de mult în ceea ce privește instalarea bibliotecii Scout. Acum că am instalat biblioteca Scout, să ne asigurăm că Laravel știe despre asta.

Lucrați cu Laravel, probabil sunteți conștient de conceptul de furnizor de servicii, care vă permite să configurați servicii în aplicația dvs. Astfel, ori de câte ori doriți să activați un serviciu nou în aplicația dvs. Laravel, trebuie doar să adăugați o intrare asociată unui furnizor de servicii în config / app.php.

Dacă nu sunteți încă familiarizați cu furnizorii de servicii Laravel încă, aș recomanda cu tărie să vă faceți o favoare și să treceți prin acest articol introductiv care explică elementele de bază ale furnizorilor de servicii din Laravel.

În cazul nostru, trebuie doar să adăugăm ScoutServiceProvider furnizorul pe lista furnizorilor de servicii din România config / app.php, așa cum se arată în fragmentul următor.

... Furnizori de servicii Laravel Framework ... * / Illuminate \ Auth \ AuthServiceProvider :: clasa, Illuminate \ Broadcasting \ BroadcastServiceProvider :: clasa, Illuminate \ Bus \ BusServiceProvider :: clasa, Illuminate \ Cache \ CacheServiceProvider: : clasa, iluminare \ Foundation \ Providers \ ConsoleSupportServiceProvider :: clasa, Illuminate \ Cookie \ CookieServiceProvider :: clasa, Illuminate \ Database \ DatabaseServiceProvider :: clasa, Illuminate \ Encryption \ EncryptionServiceProvider :: class, Illuminate \ Filesystem \ FilesystemServiceProvider :: class, Iluminare \ Foundation \ Providers \ FoundationServiceProvider :: clasă, iluminare \ Hashing \ HashServiceProvider :: clasă, iluminare \ Mail \ MailServiceProvider :: clasă, iluminare \ Notificări \ NotificationServiceProvider :: clasă, iluminare \ Pagination \ PaginationServiceProvider :: class, Illuminate \ \ PipelineServiceProvider :: clasă, iluminare \ Queue \ QueueServiceProvider :: clasă, iluminare \ Redis \ RedisServiceProvider :: clasă, iluminare \ Auth \ parole \ PasswordResetServ IceProvider :: Class, Illuminate \ Session \ SessionServiceProvider :: Clasa, Iluminare \ Traducere \ TraducereServiceProvider :: Class, Illuminate \ Validation \ ValidationServiceProvider :: Class, Illuminate \ Vizualizare \ ViewServiceProvider :: class, / * * Laravel \ Tinker \ TinkerServiceProvider :: Class, / * * Furnizori de servicii de aplicații ... * / App \ Providers \ AppServiceProvider :: class, App \ Providers \ AuthServiceProvider :: class, App \ Providers \ BroadcastServiceProvider :: class, App \ Providers \ EventServiceProvider :: clasa, App \ Providers \ RouteServiceProvider :: clasa, Laravel \ Scout \ ScoutServiceProvider :: clasa,], ... 

Laravel este conștient de asta ScoutServiceProvider furnizor de servicii. Biblioteca Scout vine cu un fișier de configurare care ne permite să setăm acreditările API.

Să mergem mai departe și să publicăm activele furnizate de biblioteca Scout utilizând următoarea comandă.

$ php artisan vendor: publish --provider = "Laravel \ Scout \ ScoutServiceProvider" Fișier copiat [/vendor/laravel/scout/config/scout.php] Pentru a [/config/scout.php] Publicarea a fost finalizată.

După cum puteți vedea, a copiat furnizor / laravel / Scout / config / scout.php fișier la config / scout.php.

Apoi, continuați și creați un cont cu Algolia, deoarece vom avea nevoie, mai întâi, de acreditările API. Odată ce aveți informațiile API, să mergem mai departe și să configurați setările necesare în config / scout.php fișier, așa cum se arată în fragmentul următor.

 env ('SCOUT_DRIVER', 'algolia'), / * | ------------------------------------ -------------------------------------- Prefixul indexului | ----------------------------------------------- --------------------------- | Aici puteți specifica un prefix care va fi aplicat pentru tot indexul de căutare | numele folosite de Scout. Acest prefix poate fi util dacă aveți multiple | "chiriașii" sau aplicațiile care au aceeași infrastructură de căutare. | * / 'prefix' => env ('SCOUT_PREFIX', '), / * | ------------------------------- ------------------------------------------- | Sincronizarea datelor de coadă | -------------------------------------------------- ---------------------- | Această opțiune vă permite să controlați dacă operațiile care sincronizează datele dvs. cu motoarele dvs. de căutare sunt în coada de așteptare. "true" apoi | toate sincronizările automate de date vor fi plasate în coadă pentru o performanță mai bună. | * / 'queue' => env ('SCOUT_QUEUE', false), / * | -------------------------------------------------- ---------------- | -------------------------------------- | Aceste opțiuni vă permit să controlați dimensiunea maximă a bucății atunci când introduceți în mod frecvent date în motorul de căutare.Aceasta vă permite să reglați fiecare dintre aceste mărimi de bucăți pe baza puterii serverelor. * / 'chunk' => ['searchable' => 500, 'unsearchable '=> 500,], / * | ---------------------------------------- ---------------------------------- | Reduceri soft | ----------------------------------------------- --------------------------- | Această opțiune vă permite să controlați dacă să păstrați înregistrările șterse moi în indicele de căutare. Menținerea înregistrărilor moarte șterse poate fi utilă dacă aplicația dvs. trebuie să caute mai târziu înregistrările. | * / 'soft_delete' => false, / * | -------------------------------------- ------------------------------------ | Algolia Configuration | ----------------------------------------------- --------------------------- | Aici puteți configura setările pentru Algolia. Algolia este un nor găzduit | motor de căutare care funcționează excelent cu Scout din cutie. Doar conectați | în ID-ul aplicației și cheia API pentru a începe căutarea. | * / 'algolia' => ['id' => env ('ALGOLIA_APP_ID', 'STQK4DEGMA'), 'secret' => env ('ALGOLIA_SECRET', '6ef572194f70201ed7ad102cc9f90e05');

Rețineți că am setat valoarea SCOUT_DRIVER la algolia conducător auto. Astfel, este necesar să configurați setările necesare pentru driverul Algolia la sfârșitul fișierului. Practic, trebuie doar să setați id și secret pe care le-ați primit din contul Algolia.

După cum puteți vedea, preluăm valori din variabilele de mediu. Deci, să ne asigurăm că setăm următoarele variabile în .env fișierul corect.

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

În cele din urmă, trebuie să instalați Algolia PHP SDK, care va fi folosit pentru a interacționa cu Algolia folosind API-uri. Să o instalăm folosind compozitorul așa cum se arată în fragmentul următor.

$ compozitorul necesită algolia / algoliasearch-client-php

Și cu asta, am instalat toate dependențele necesare pentru a posta și indexa date către serviciul Algolia.

Face modelele indexabile și căutate

În secțiunea anterioară, am depus toate eforturile pentru a configura bibliotecile Scout și Algolia, astfel încât să putem indexa și să căutăm date utilizând serviciul de căutare Algolia.

În această secțiune, vom trece printr-un exemplu care arată modul în care puteți indexa datele existente și puteți prelua rezultatele căutării de la Algolia. Presupun că ai implicit Post model în aplicația pe care o vom folosi în exemplul nostru.

Primul lucru pe care trebuie să-l facem este să adăugăm Laravel \ Scout \ Searchable trăsătură la Post model. Asta face ca Post model de căutare; Laravel sincronizează înregistrările post cu indexul Algolia de fiecare dată când postarea, actualizarea sau ștergerea înregistrării postate.

Cu asta, Post modelul este ușor de utilizat!

Apoi, dorim să configuram câmpurile care ar trebui să fie indexate în primul rând. Desigur, nu doriți să indexați toate câmpurile modelului dvs. în Algolia pentru al menține eficiența și ușurința. De fapt, de cele mai multe ori, nu veți avea nevoie de ea.

Puteți adăuga toSearchableArray din clasa de modele pentru a configura câmpurile care vor fi indexate.

/ ** * Obțineți matricea de date indexabilă pentru model. * * @return array * / funcția publică toSearchableArray () $ array = $ this-> toArray (); retur array ('id' => $ array ['id'], 'nume' => $ array ['nume']); 

Acum, suntem gata să importăm și să indexăm existente Post înregistrează în Algolia. De fapt, biblioteca Scout face acest lucru ușor, oferind următoarea comandă artizanală.

$ scp artisan scout: import "App \ Post"

Asta ar trebui să importe toate înregistrările Post model într-un singur du-te! Ele sunt indexate de îndată ce sunt importate, deci suntem gata să interogăm deja înregistrările. Continuați și explorați tabloul de bord Algolia pentru a vedea înregistrările importate și alte utilități.

Cum funcționează în totalitate

În această secțiune, vom crea un exemplu care demonstrează modul de efectuare a operațiilor de căutare și CRUD care sunt sincronizate în timp real cu indexul Algolia.

Continuați și creați app / HTTP / Controllers / SearchController.php fișier cu următorul conținut.

obține(); // face lucrurile obișnuite aici foreach ($ posts ca $ post) // ... funcția publică add () // acest post ar trebui indexat imediat la Algolia! $ post = post nou; $ post-> setAttribute ("nume", "altă postare"); $ post-> setAttribute ('user_id', '1'); $ Post-> save ();  funcția publică șterge () // acest post ar trebui să fie eliminat din indexul de la Algolia imediat! $ post = Post :: găsi (1); $ Post-> șterge (); 

Desigur, trebuie să adăugăm și rutele asociate.

Route :: get ('căutare / interogare', 'SearchController @ query'); Route :: get ('căutare / adăugare', 'SearchController @ add'); Route :: get ('căutare / ștergere', 'SearchController @ delete');

Să trecem prin întrebare pentru a vedea cum să efectuați o căutare în Algolia.

interogarea funcției publice () // interogări către indexul de căutare Algolia și returnarea înregistrărilor potrivite ca modele elocvente $ posts = Post :: search ('title') -> get (); // face lucrurile obișnuite aici ($ postări ca $ post) // ...

Amintiți-vă că am făcut-o Post model care poate fi căutat prin adăugarea Searchable trăsătură. Astfel, Post model poate folosi căutare de recuperare a înregistrărilor din indicele Algolia. În exemplul de mai sus, încercăm să obținem înregistrări care se potrivesc titlu cuvinte cheie.

Mai departe, există adăuga care imită fluxul de lucru de adăugare a unei noi înregistrări postale.

funcția publică adăugă () // această postare trebuie indexată imediat la Algolia! $ post = post nou; $ post-> setAttribute ("nume", "altă postare"); $ post-> setAttribute ('user_id', '1'); $ Post-> save (); 

Nu există nimic fantezist în codul de mai sus; acesta creează doar o nouă înregistrare post folosind Post model. Cu exceptia Post model implementează Searchable astfel încât Laravel face o muncă suplimentară de data aceasta prin indexarea înregistrării nou create în Algolia. După cum puteți vedea, indexarea se face în timp real.

În cele din urmă, există șterge metodă. Să mergem și ea.

funcția publică șterge () // această postare ar trebui să fie eliminată din indexul de la Algolia imediat! $ post = Post :: găsi (1); $ Post-> șterge (); 

După cum v-ați fi așteptat, înregistrarea va fi șters imediat de indicele Algolia de îndată ce va fi șters din baza de date.

Practic, nu este nevoie de efort suplimentar din partea dvs., dacă doriți ca modelele existente să poată fi căutate. Totul este gestionat de biblioteca Scout folosind observatori de model.

Și asta ne aduce și la sfârșitul acestui articol!

Concluzie

Astăzi, am discutat despre modul în care puteți implementa căutarea fulltext în Laravel folosind biblioteca Laravel Scout. În acest proces, am trecut prin instalațiile necesare și un exemplu din lumea reală pentru a le demonstra.

Simțiți-vă liber să întrebați dacă aveți întrebări sau îndoieli cu ajutorul feedului de comentarii de mai jos!

Cod