Fulltextsökning är avgörande för att användare ska kunna navigera på innehållsrika webbplatser. I det här inlägget ska jag visa dig hur du genomför fullständig textsökning för en Laravel-app. Faktum är att vi använder Laravel Scout-biblioteket, vilket gör genomförandet av fulltextsökning enkelt och roligt.
Vad exakt är Laravel Scout? Den officiella dokumentationen summerar den så här:
Laravel Scout ger en enkel, drivrutinsbaserad lösning för att lägga till fulltextsökning i dina Eloquent-modeller. Genom att använda modellobservatörer kommer Scout automatiskt att hålla dina sökindex synkroniserat med dina Eloquent-poster.
I grund och botten är Laravel Scout ett bibliotek som hanterar manipulation av indexet när det finns en förändring i modelldata. Platsen där data kommer att indexeras beror på drivrutinen som du har konfigurerat med Scout-biblioteket.
Från och med nu stöder Scout-biblioteket Algolia, ett molnbaserat sökmotor-API, och det är vad vi ska använda i den här artikeln för att visa genomförandet av fulltextsökning.
Vi börjar med att installera Scout och Algolys serverbibliotek, och när vi går vidare går vi igenom ett verkligt exempel för att visa hur du kan indexera och söka dina data.
I det här avsnittet kommer vi att installera de beroenden som krävs för att Scout-biblioteket ska fungera med Laravel. Efter installationen måste vi gå igenom en hel del konfiguration så att Laravel kan upptäcka Scout-biblioteket.
Låt oss fortsätta och installera Scout-biblioteket med hjälp av Kompositör.
$ komponent kräver laravel / scout
Det är ganska mycket så långt som Scout-bibliotekets installation berörs. Nu när vi har installerat Scout-biblioteket, låt oss se till att Laravel vet om det.
Arbeta med Laravel, du är förmodligen medveten om konceptet av en tjänsteleverantör, som låter dig konfigurera tjänster i din ansökan. Så snart du vill aktivera en ny tjänst i din Laravel-applikation behöver du bara lägga till en tillhörande tjänsteleverantörsinträde i config / app.php
.
Om du inte är bekant med Laravel-tjänsteleverantörer än, rekommenderar jag starkt att du gör dig själv en tjänst och gå igenom den här inledande artikeln som förklarar grunderna för tjänsteleverantörer i Laravel.
I vårt fall behöver vi bara lägga till ScoutServiceProvider
leverantör till listan över tjänsteleverantörer i config / app.php
, som visas i följande kod.
... [leverantörer] => [/ * * Laravel Framework Service Providers ... * / Belysa \ Auth \ AuthServiceProvider :: klass, belysa \ Broadcasting \ BroadcastServiceProvider :: klass, belysa \ Bus \ BusServiceProvider :: klass, belysa \ Cache \ CacheServiceProvider: : klass, belysa \ Foundation \ Providers \ ConsoleSupportServiceProvider :: klass, upplysa \ Cookie \ CookieServiceProvider :: klass, belysa \ Databas \ DatabasServiceProvider :: klass, belysa \ Kryptering \ EncryptionServiceProvider :: klass, belysa \ Filsystem \ FilesystemServiceProvider :: klass, Illuminate \ Foundation \ Providers \ FoundationServiceProvider :: klass, belysa \ Hashing \ HashServiceProvider :: klass, belysa \ Mail \ MailServiceProvider :: klass, belysa \ Notifieringar \ NotificationServiceProvider :: klass, belysa \ Pagination \ PaginationServiceProvider :: klass, belysa \ Pipeline \ PipelineServiceProvider :: klass, belysa \ Queue \ QueueServiceProvider :: klass, belysa \ Redis \ RedisServiceProvider :: klass, belysa \ Auth \ Lösenord \ PasswordResetServ iceProvider :: class, Illuminate \ Session \ SessionServiceProvider :: class, Illuminate \ Översättning \ TranslationServiceProvider :: class, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ Visa \ ViewServiceProvider :: class, / * * Paketleverantörer ... * / Laravel \ Tinker \ TinkerServiceProvider :: klass, / * * Applikationsleverantörer ... * / App \ Providers \ AppServiceProvider :: klass, App \ Providers \ AuthServiceProvider :: klass, App \ Providers \ BroadcastServiceProvider :: klass, App \ Providers \ EventServiceProvider :: klass, App \ Providers \ RouteServiceProvider :: klass, Laravel \ Scout \ ScoutServiceProvider :: klass,], ...
Nu är Laravel medveten om ScoutServiceProvider
tjänsteleverantör. Scout-biblioteket levereras med en konfigurationsfil som tillåter oss att ange API-referenser.
Låt oss fortsätta och publicera tillgångarna som tillhandahålls av Scout-biblioteket med följande kommando.
$ php artisan leverantör: publicera --provider = "Laravel \ Scout \ ScoutServiceProvider" Kopierad fil [/vendor/laravel/scout/config/scout.php] Till [/config/scout.php] Publicering komplett.
Som du kan se har den kopierat försäljaren / laravel / scout / config / scout.php
fil till config / scout.php
.
Fortsätt sedan och skapa ett konto hos Algolia, eftersom vi i första hand behöver API-uppgifter. När du har API-informationen, låt oss fortsätta och konfigurera nödvändiga inställningar i config / scout.php
fil, som visas i följande kod.
env ('SCOUT_DRIVER', 'algolia'), / * | ------------------------------------ -------------------------------------- | Index Prefix | ----------------------------------------------- --------------------------- | | Här kan du ange ett prefix som ska tillämpas på alla sökindex | namn som används av Scout. Det här prefixet kan vara användbart om du har flera | "hyresgäster" eller program som delar samma sökinfrastruktur. | * / 'prefix' => env ('SCOUT_PREFIX', '), / * | ------------------------------- ------------------------------------------- | Queue Data Syncing | - -------------------------------------------------- ---------------------- | | Med det här alternativet kan du kontrollera om de operationer som synkroniserar dina data | med dina sökmotorer är i kö. När detta är inställt på "true" då | alla automatiska datasynkronisering kommer att köras för bättre prestanda. | * / 'queue = = env (' SCOUT_QUEUE ', falsk), / * | -------------- -------------------------------------------------- ---------- | Chunk Storlekar | ------------------------------------ -------------------------------------- | | Med dessa alternativ kan du styra maximal storlek när du är | massa importerar data till sökmotorn. Det här låter dig finjustera alla dessa bitstorlekar baserat på servrarna. | * / 'chunk' => ['searchable' => 500, 'unsearchable '=> 500,], / * | ---------------------------------------- ---------------------------------- | Mjuka raderingar | ----------------------------------------------- --------------------------- | | Med det här alternativet kan du kontrollera om mjuka raderade poster ska sparas i | sökindexen. Att behålla mjuka borttagna poster kan vara användbart | om din ansökan fortfarande behöver söka efter poster senare. | * / 'soft_delete' => false, / * | -------------------------------------- ------------------------------------ | Algolikonfiguration | ----------------------------------------------- --------------------------- | | Här kan du konfigurera dina Algolys inställningar. Algolia är ett moln värd | sökmotor som fungerar bra med Scout ut ur lådan. Bara plugga | i ditt program-ID och admin-API-tangenten för att komma igång med att söka. | * / 'algolia' => ['id' => env ('ALGOLIA_APP_ID', 'STQK4DEGMA'), 'hemlig' => env ('ALGOLIA_SECRET', '6ef572194f70201ed7ad102cc9f90e05')]];
Observera att vi har satt värdet på SCOUT_DRIVER
till algolia
förare. Det krävs sålunda att du konfigurerar nödvändiga inställningar för Algolia-drivrutinen i slutet av filen. I grund och botten behöver du bara ställa in id
och hemlighet
som du har från Algoliet konto.
Som du kan se hämtar vi värden från miljövariabler. Så låt oss se till att vi ställer in följande variabler i .env
filen korrekt.
... ALGOLIA_APP_ID = STQK4DEGMA ALGOLIA_SECRET = 6ef572194f70201ed7ad102cc9f90e05 ...
Slutligen måste vi installera Algolys PHP SDK, som kommer att användas för att interagera med Algoliet med hjälp av API. Låt oss installera det med hjälp av kompositören som visas i följande kod.
$ komponent kräver algolia / algoliasearch-client-php
Och med det har vi installerat alla beroenden som är nödvändiga för att posta och indexera data till Algolys tjänsten.
I det föregående avsnittet gjorde vi allt det hårda arbetet med att skapa Scout- och Algolibiblioteken så att vi kunde indexera och söka data med hjälp av Algolys söktjänst.
I det här avsnittet går vi igenom ett exempel som visar hur du kan indexera befintliga data och hämta sökresultat från Algoliet. Jag antar att du har en standard Posta
modell i din ansökan som vi ska använda i vårt exempel.
Det första vi behöver göra är att lägga till Laravel \ Scout \ sökbara
egenskap till Posta
modell. Det gör det Posta
modell sökbar; Laravel synkroniserar postrekord med Algolys index varje gång posten läggs till, uppdateras eller raderas.
Med det
Posta
Modellen är sökvänlig!Därefter vill vi konfigurera fälten som ska bli indexerade i första hand. Naturligtvis vill du inte indexera alla fält i din modell i Algolia för att hålla den effektiv och lätt. Faktum är att du oftare inte behöver det.
Du kan lägga till
toSearchableArray
i modellklassen för att konfigurera fälten som ska indexeras./ ** * Hämta indexbar data array för modellen. * * @return array * / public function toSearchableArray () $ array = $ this-> toArray (); returnera array ('id' => $ array ['id'], 'name' => $ array ['name']);Nu är vi redo att importera och indexera befintliga
Posta
poster i Algolien. Faktum är att Scout-biblioteket gör det enkelt genom att tillhandahålla följande artisan-kommando.$ php artisan scout: importera "App \ Post"Det ska importera alla register över
Posta
modell på samma gång! De indexeras så fort de importeras, så vi är redo att fråga poster redan. Gå vidare och utforska Algolys instrumentbräda för att se importerade poster och andra verktyg.Hur det fungerar helt och hållet
I det här avsnittet skapar vi ett exempel som visar hur man utför sökningar och CRUD-operationer som synkroniseras i realtid med Algoliet index.
Gå vidare och skapa
app / HTTP / Controllers / SearchController.php
fil med följande innehåll.skaffa sig(); // gör vanliga saker här för ($ inlägg som $ post) // ... public function add () // det här inlägget bör indexeras i Algolia direkt! $ post = ny post; $ post-> setAttribute ('name', 'Another Post'); $ post-> setAttribute ('user_id', '1'); $ Post-> save (); public function delete () // det här inlägget ska tas bort från indexet i Algolia direkt! $ post = Post :: hitta (1); $ Post-> Delete ();Självklart måste vi också lägga till de tillhörande vägarna.
Rutt :: get ('search / query', 'SearchController @ query'); Rutt :: get ('search / add', 'SearchController @ add'); Rutt :: get ('search / delete', 'SearchController @ delete');Låt oss gå igenom
fråga
metod för att se hur man utför en sökning i Algoliet.public function query () // frågorna till Algolys sökindex och returnerar matchade poster som Eloquent Modeller $ posts = Post :: search ('title') -> get (); // gör de vanliga sakerna här för ($ inlägg som $ post) // ...Minns att vi gjorde
Posta
modell sökbar genom att lägga tillSökbar
drag. SåledesPosta
Modellen kan användaSök
Metod för att hämta poster från Algolys index. I det ovanstående exemplet försöker vi hämta poster som matchartitel
nyckelord.Därefter finns det
Lägg till
metod som efterliknar arbetsflödet för att lägga till en ny postrekord.public function add () // det här inlägget bör indexeras i Algolia direkt! $ post = ny post; $ post-> setAttribute ('name', 'Another Post'); $ post-> setAttribute ('user_id', '1'); $ Post-> save ();Det finns inget fancy i ovanstående kod; det skapar bara en ny postrekord med hjälp av
Posta
modell. MenPosta
Modellen implementerarSökbar
egenskap, så Laravel gör lite extra arbete den här gången genom att indexera den nyskapade posten i Algolia. Såsom du kan se är indexeringen gjord i realtid.Slutligen finns det
radera
metod. Låt oss gå igenom det också.public function delete () // det här inlägget bör tas bort från indexet i Algolia direkt! $ post = Post :: hitta (1); $ Post-> Delete ();Som du skulle ha förväntat raderas posten direkt från Algolys index så snart den är raderad från databasen.
I grund och botten behövs ingen extra ansträngning från din sida om du vill göra befintliga modeller sökbara. Allt hanteras av Scout-biblioteket med hjälp av modellobservatörer.
Och det tar oss också till slutet av denna artikel!
Slutsats
Idag diskuterade vi hur du kan implementera fulltextsökning i Laravel med Laravel Scout-biblioteket. I processen gick vi igenom nödvändiga installationer och ett verkligt exempel för att visa det.
Fråga gärna om du har några frågor eller tvivel med hjälp av kommentarspåret nedan!