Skip to main content

Introduzione

Laravel Scout è una soluzione semplice e basata su driver per aggiungere la ricerca full-text ai modelli Eloquent. Grazie a un model observer sincronizza automaticamente i record Eloquent con l’indice di ricerca. Scout include un engine database integrato che sfrutta gli indici full-text di MySQL/PostgreSQL e la clausola LIKE per cercare direttamente nel database, senza servizi esterni. In produzione, per applicazioni grandi che richiedono tolleranza ai typo, ricerca a faccette o ricerca geografica, sono utili gli engine esterni.

Engine supportati

Installazione

Installa il pacchetto con Composer.
Dopo l’installazione, pubblica il file di configurazione con vendor:publish. Viene generato config/scout.php.
Aggiungi infine il trait Laravel\Scout\Searchable ai modelli che vuoi rendere ricercabili. Il trait registra il model observer e abilita la sincronizzazione automatica con il driver di ricerca.

Configurazione della coda

Se usi un engine diverso da database o collection, è fortemente consigliato configurare un driver di coda prima di usare Scout. Con un queue worker attivo le operazioni di sincronizzazione dell’indice avvengono in background e la reattività della UI migliora molto. Imposta a true l’opzione queue in config/scout.php.
Puoi anche indicare connection e nome della coda.
Poi avvia un worker dedicato.

Job unique

Nelle app con molte scritture, potresti voler evitare che vengano accodati job duplicati per lo stesso record. Registrando le classi MakeSearchableUniquely e RemoveFromSearchUniquely in config/scout.php puoi usare job di indicizzazione unique. Di solito lo configuri nel metodo boot di un service provider.
Questi job usano i lock per job unique di Laravel per impedire il dispatch di operazioni di indicizzazione duplicate per lo stesso record già presente in coda.

Prerequisiti dei driver

Algolia

Se usi il driver Algolia, imposta id e secret in config/scout.php e installa l’SDK PHP di Algolia.
Aggiungi le credenziali nel .env.

Configurazione dell’indice

Con Algolia puoi gestire le impostazioni dell’indice da config/scout.php.
Dopo la configurazione esegui scout:sync-index-settings per applicarla ad Algolia.

Meilisearch

Meilisearch è un motore di ricerca open source molto veloce. In sviluppo locale il modo più semplice è usarne l’immagine Docker con Laravel Sail.
Senza Sail puoi avviarlo direttamente con Docker.
Installa l’SDK PHP di Meilisearch.
Imposta driver e host nel .env.
Quando aggiorni Scout, controlla anche i breaking change di Meilisearch stesso.

Configurazione dell’indice (Meilisearch)

In Meilisearch devi pre-registrare le colonne su cui filtri con where() in filterableAttributes e quelle su cui ordini con orderBy() in sortableAttributes.
Attenzione al tipo dei dati numerici. Meilisearch può fare operazioni di filtro (>, < ecc.) solo su dati del tipo corretto.
Dopo la configurazione esegui scout:sync-index-settings.

Typesense

Typesense è un motore di ricerca open source veloce che supporta ricerca per keyword, semantica, geografica e vettoriale.
Configura la connessione nel .env.
Con Typesense, in toSearchableArray devi castare la primary key a stringa e la data di creazione a timestamp UNIX.

Engine database / collection

Se non vuoi introdurre servizi esterni, sono le opzioni migliori. L’engine database usa gli indici full-text di MySQL/PostgreSQL e la clausola LIKE. Per la maggior parte delle applicazioni è sufficiente.
L’engine collection filtra in PHP, quindi funziona con qualsiasi database supportato da Laravel, incluso SQLite. Adatto a sviluppo locale, test e piccoli dataset.
Con l’engine database, a differenza degli engine esterni, non serve gestire manualmente l’indice: la ricerca avviene direttamente sulla tabella.

Trait Searchable

Personalizzare toSearchableArray()

Per default, l’intero risultato di toArray() viene salvato nell’indice. Per personalizzare i dati sincronizzati, sovrascrivi toSearchableArray.

Personalizzare il nome dell’indice

Di default viene usato il nome della tabella (plurale) come nome dell’indice. Puoi personalizzarlo sovrascrivendo searchableAs.

Strategie di ricerca per l’engine database

Con l’engine database puoi indicare, tramite attributi PHP, una strategia di ricerca efficiente per colonna.
Prima di usare SearchUsingFullText verifica che sulla colonna sia presente un indice full-text.

Rendere ricercabili condizionalmente

Per rendere ricercabile un modello solo in certe condizioni, definisci shouldBeSearchable.
shouldBeSearchable non funziona con l’engine database. Per ottenere lo stesso comportamento con l’engine database, usa una clausola where.

Gestione dell’indice

I comandi di questa sezione riguardano principalmente engine di terze parti come Algolia, Meilisearch, Typesense. Con l’engine database non serve gestire l’indice.

Importare record esistenti

Quando introduci Scout in un progetto esistente, importa i record con scout:import.
Puoi importare in background usando la coda.

Svuotare l’indice

Per rimuovere tutti i record del modello dall’indice usa scout:flush.

Pausa dell’indicizzazione

Per interrompere temporaneamente la sincronizzazione con l’indice durante operazioni Eloquent, usa withoutSyncingToSearch.

Aggiunta / rimozione manuale

Puoi aggiungere all’indice una collezione di modelli tramite query.
Per rimuovere dall’indice usa unsearchable.
Il delete di un modello lo rimuove automaticamente anche dall’indice.

Ricerca

Con search cerchi sul modello. Concatena get per ottenere una collezione di modelli Eloquent.
Restituendola direttamente da un controller o una route viene convertita automaticamente in JSON.
Se ti servono i risultati grezzi usa raw.

Paginazione

Con paginate puoi paginare i risultati come nelle query Eloquent normali.
Con l’engine database puoi usare anche simplePaginate, più efficiente su grandi dataset perché non calcola il totale.
Esempio in Blade:

Filtri e ordinamento

Con where aggiungi condizioni di filtro alla query di ricerca.
Con Meilisearch, prima di usare where devi configurare gli attributi filtrabili.
Con query puoi personalizzare la query Eloquent.

Eager Loading

Scout prima ottiene la lista di ID dal motore di ricerca, poi recupera i modelli con Eloquent. Per evitare il problema N+1, indica l’eager loading in query con with().
Per fare eager load delle relazioni durante l’import in blocco, definisci makeAllSearchableUsing.
makeAllSearchableUsing può non funzionare con l’import batch tramite code: le relazioni non vengono ripristinate quando i modelli sono processati come job in coda.

Soft delete

Se il modello indicizzato usa il soft delete e vuoi cercare anche i modelli cancellati, imposta l’opzione soft_delete in config/scout.php a true.
Attivandola, con withTrashed o onlyTrashed puoi includere i record cancellati.

Engine personalizzati

Se gli engine di default non ti bastano, puoi implementarne uno personalizzato. Un engine personalizzato estende la classe astratta Laravel\Scout\Engines\Engine e deve implementare questi otto metodi.
Come riferimento per l’implementazione, consulta la classe Laravel\Scout\Engines\AlgoliaEngine. L’engine personalizzato si registra su Scout nel metodo boot di App\Providers\AppServiceProvider.
Poi indicalo come driver in config/scout.php.

Pagine correlate

Eloquent ORM

Uso di base dei modelli Eloquent.

Relazioni Eloquent

Definizione delle relazioni ed eager loading.

Code

Scout può aggiornare l’indice in background grazie alle code.
Ultima modifica il 2 agosto 2026