Come impostare una ricerca full-text utilizzando Scout in Laravel

La ricerca full-text è fondamentale per consentire agli utenti di navigare in siti Web ricchi di contenuti. In questo post, ti mostrerò come implementare la ricerca full-text per un'app Laravel. In effetti, utilizzeremo la libreria di Laravel Scout, che rende l'implementazione della ricerca full-text facile e divertente.

Che cos'è esattamente il Laravel Scout? La documentazione ufficiale lo riassume così:

Laravel Scout offre una soluzione semplice e basata su driver per l'aggiunta della ricerca full-text ai modelli Eloquent. Usando osservatori di modelli, Scout manterrà automaticamente gli indici di ricerca in sincronia con i tuoi record di Eloquent.

Fondamentalmente, Laravel Scout è una libreria che gestisce la manipolazione dell'indice ogni volta che c'è un cambiamento nei dati del modello. Il luogo in cui i dati verranno indicizzati dipende dal driver che hai configurato con la libreria Scout.

A partire da ora, la libreria Scout supporta Algolia, un'API del motore di ricerca basata su cloud, ed è quello che useremo in questo articolo per dimostrare l'implementazione della ricerca full-text.

Inizieremo con l'installazione delle librerie del server Scout e Algolia e, procedendo, passeremo attraverso un esempio reale per dimostrare come è possibile indicizzare e cercare i dati.

Configurazioni del server

In questa sezione, installeremo le dipendenze necessarie per far funzionare la libreria Scout con Laravel. Dopo l'installazione, avremo bisogno di un bel po 'di configurazione in modo che Laravel possa rilevare la libreria Scout.

Andiamo avanti e installiamo la libreria Scout usando Composer.

$ compositore richiede laravel / scout

Questo è abbastanza per quanto riguarda l'installazione della libreria Scout. Ora che abbiamo installato la libreria Scout, assicuriamoci che Laravel lo sappia.

Lavorando con Laravel, probabilmente sei a conoscenza del concetto di un fornitore di servizi, che ti consente di configurare i servizi nella tua applicazione. Pertanto, ogni volta che si desidera abilitare un nuovo servizio nella propria applicazione Laravel, è sufficiente aggiungere una voce del fornitore di servizi associato in config / app.php.

Se non hai ancora familiarità con i fornitori di servizi Laravel, ti consiglio vivamente di fare un favore a te stesso e di leggere questo articolo introduttivo che spiega le basi dei fornitori di servizi in Laravel.

Nel nostro caso, abbiamo solo bisogno di aggiungere il ScoutServiceProvider fornitore all'elenco dei fornitori di servizi in config / app.php, come mostrato nel seguente frammento.

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

Ora, Laravel è a conoscenza del ScoutServiceProvider fornitore di servizi. La libreria Scout viene fornita con un file di configurazione che ci consente di impostare le credenziali API.

Andiamo avanti e pubblichiamo le risorse fornite dalla libreria Scout usando il seguente comando.

$ php artisan vendor: publish --provider = "Laravel \ Scout \ ScoutServiceProvider" File copiato [/vendor/laravel/scout/config/scout.php] To [/config/scout.php] Pubblicazione completa.

Come puoi vedere, ha copiato il file vendor / laravel / Scout / config / scout.php file su config / scout.php.

Successivamente, vai avanti e crea un account con Algolia poiché avremo bisogno delle credenziali API in primo luogo. Una volta che hai le informazioni API, andiamo avanti e configuriamo le impostazioni necessarie in config / scout.php file, come mostrato nello snippet seguente.

 env ('SCOUT_DRIVER', 'algolia'), / * | ------------------------------------ -------------------------------------- | Prefisso indice | ----------------------------------------------- --------------------------- | | Qui puoi specificare un prefisso che verrà applicato a tutti gli indici di ricerca | nomi usati da Scout. Questo prefisso può essere utile se si dispone di più | "tenant" o applicazioni che condividono la stessa infrastruttura di ricerca. | * / 'prefix' => env ('SCOUT_PREFIX', "), / * | ------------------------------- ------------------------------------------- | Sincronizzazione dati code | - -------------------------------------------------- ---------------------- | | Questa opzione ti consente di controllare se le operazioni che sincronizzano i tuoi dati | con i tuoi motori di ricerca sono messe in coda. "true" quindi | tutta la sincronizzazione automatica dei dati verrà messa in coda per prestazioni migliori. | * / 'queue' => env ('SCOUT_QUEUE', false), / * | -------------- -------------------------------------------------- ---------- | Dimensioni dei blocchi | ------------------------------------ -------------------------------------- | | Queste opzioni consentono di controllare la dimensione massima del blocco quando si importano i dati di massa nel motore di ricerca, questo consente di perfezionare ciascuna di queste dimensioni del blocco in base alla potenza dei server. | * / 'chunk' => ['searchable' => 500, 'unsearchable '=> 500,], / * | ---------------------------------------- ---------------------------------- | Cancellazioni ridotte | ----------------------------------------------- --------------------------- | | Questa opzione ti consente di controllare se mantenere i record eliminati in modo flessibile in | gli indici di ricerca. Mantenere i record cancellati molli può essere utile | se la tua applicazione ha ancora bisogno di cercare i record più tardi. | * / 'soft_delete' => false, / * | -------------------------------------- ------------------------------------ | Configurazione di Algolia | ----------------------------------------------- --------------------------- | | Qui puoi configurare le impostazioni di Algolia. Algolia è una nuvola ospitata | motore di ricerca che funziona alla grande con Scout out of the box. Basta collegare | nell'ID dell'applicazione e nella chiave API dell'amministratore per iniziare la ricerca. | * / 'algolia' => ['id' => env ('ALGOLIA_APP_ID', 'STQK4DEGMA'), 'secret' => env ('ALGOLIA_SECRET', '6ef572194f70201ed7ad102cc9f90e05'),],];

Si noti che abbiamo impostato il valore di SCOUT_DRIVER a algolia conducente. Pertanto, è necessario configurare le impostazioni necessarie per il driver Algolia alla fine del file. Fondamentalmente, hai solo bisogno di impostare il id e segreto che hai dal conto Algolia.

Come puoi vedere, stiamo recuperando i valori dalle variabili di ambiente. Quindi assicuriamoci di impostare le seguenti variabili in .ENV file correttamente.

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

Infine, abbiamo bisogno di installare l'SDK Algolia PHP, che sarà usato per interagire con l'Algolia usando le API. Installiamolo usando il compositore come mostrato nel seguente frammento.

$ compositore richiede algolia / algoliasearch-client-php

E con questo, abbiamo installato tutte le dipendenze necessarie per pubblicare e indicizzare i dati sul servizio Algolia.

Rendi i modelli indicizzabili e ricercabili

Nella sezione precedente, abbiamo fatto tutto il lavoro necessario per impostare le librerie Scout e Algolia in modo da poter indicizzare e cercare i dati utilizzando il servizio di ricerca Algolia.

In questa sezione, vedremo un esempio che dimostra come è possibile indicizzare i dati esistenti e recuperare i risultati della ricerca da Algolia. Presumo che tu abbia un valore predefinito Inviare modello della tua applicazione che utilizzeremo nel nostro esempio.

La prima cosa che dovremo fare è aggiungere il Laravel \ Scout \ ricercabile tratto al Inviare modello. Questo rende il Inviare modello ricercabile; Laravel sincronizza i record postali con l'indice Algolia ogni volta che il record viene aggiunto, aggiornato o cancellato.

Con quello, il Inviare il modello è ricercabile!

Successivamente, vorremmo configurare i campi che dovrebbero essere indicizzati in primo luogo. Naturalmente, non è necessario indicizzare tutti i campi del modello in Algolia per mantenerlo efficace e leggero. In effetti, il più delle volte, non ne avrai bisogno.

È possibile aggiungere il toSearchableArray nella classe del modello per configurare i campi che verranno indicizzati.

/ ** * Ottieni l'array di dati indicizzabili per il modello. * * @return array * / public function toSearchableArray () $ array = $ this-> toArray (); return array ('id' => $ array ['id'], 'name' => $ array ['name']); 

Ora siamo pronti per importare e indicizzare esistenti Inviare registra in Algolia. In effetti, la libreria Scout rende tutto ciò semplice fornendo il seguente comando artigianale.

$ php artisan scout: importa "App \ Post"

Questo dovrebbe importare tutti i record del Inviare modella in una volta sola! Vengono indicizzati non appena vengono importati, quindi siamo pronti a eseguire query sui record già. Vai avanti ed esplora la dashboard di Algolia per vedere i record importati e altre utilità.

Come funziona Complessivamente

In questa sezione creeremo un esempio che dimostra come eseguire operazioni di ricerca e CRUD sincronizzate in tempo reale con l'indice Algolia.

Vai avanti e crea il App / HTTP / Controller / SearchController.php file con il seguente contenuto.

ottenere(); // fai le solite cose qui foreach ($ post come $ post) // ... public function add () // questo post dovrebbe essere indicizzato subito ad Algolia! $ post = new Post; $ post-> setAttribute ('name', 'Another Post'); $ post-> setAttribute ('user_id', '1'); $ Post-> save ();  public function delete () // questo post dovrebbe essere rimosso dall'indice in Algolia subito! $ post = Post :: find (1); $ Post-> delete (); 

Ovviamente, dobbiamo aggiungere anche i percorsi associati.

Route :: get ('search / query', 'SearchController @ query'); Route :: get ('cerca / aggiungi', 'SearchController @ add'); Route :: get ('cerca / cancella', 'CercaController @ cancella');

Passiamo al domanda metodo per vedere come eseguire una ricerca in Algolia.

query di funzione pubblica () // esegue una query sull'indice di ricerca Algolia e restituisce i record corrispondenti come Modelli eloquenti $ posts = Post :: search ('title') -> get (); // fai le solite cose qui foreach ($ post come $ post) // ...

Ricordiamo che abbiamo fatto il Inviare modello ricercabile aggiungendo il ricercabile tratto. Quindi, il Inviare il modello può usare il ricerca metodo per recuperare i record dall'indice Algolia. Nell'esempio sopra, stiamo cercando di recuperare i record che corrispondono a titolo parola chiave.

Avanti, c'è il Inserisci metodo che imita il flusso di lavoro di aggiungere un nuovo record.

funzione pubblica add () // questo post deve essere indicizzato in Algolia subito! $ post = new Post; $ post-> setAttribute ('name', 'Another Post'); $ post-> setAttribute ('user_id', '1'); $ Post-> save (); 

Non c'è niente di speciale nel codice sopra; crea semplicemente un nuovo record dopo aver usato il Inviare modello. Ma il Inviare il modello implementa il ricercabile tratto, quindi Laravel fa un lavoro extra questa volta indicizzando il record appena creato in Algolia. Quindi, come puoi vedere, l'indicizzazione avviene in tempo reale.

Infine, c'è il Elimina metodo. Passiamo anche a questo.

public function delete () // questo post dovrebbe essere rimosso dall'indice in Algolia subito! $ post = Post :: find (1); $ Post-> delete (); 

Come previsto, il record viene cancellato immediatamente dall'indice Algolia non appena viene eliminato dal database.

Fondamentalmente, non ci sono ulteriori sforzi da parte tua se vuoi rendere ricercabili i modelli esistenti. Tutto è gestito dalla biblioteca Scout usando osservatori di modelli.

E questo ci porta anche alla fine di questo articolo!

Conclusione

Oggi abbiamo discusso su come implementare la ricerca full-text in Laravel usando la libreria di Laravel Scout. Nel processo, abbiamo analizzato le installazioni necessarie e un esempio reale per dimostrarlo.

Sentiti libero di chiedere se hai domande o dubbi usando il feed dei commenti qui sotto!