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 enginedatabase 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.vendor:publish. Viene generato config/scout.php.
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 dadatabase 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.
Job unique
Nelle app con molte scritture, potresti voler evitare che vengano accodati job duplicati per lo stesso record. Registrando le classiMakeSearchableUniquely e RemoveFromSearchUniquely in config/scout.php puoi usare job di indicizzazione unique. Di solito lo configuri nel metodo boot di un service provider.
Prerequisiti dei driver
Algolia
Se usi il driver Algolia, impostaid e secret in config/scout.php e installa l’SDK PHP di Algolia.
.env.
Configurazione dell’indice
Con Algolia puoi gestire le impostazioni dell’indice daconfig/scout.php.
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..env.
Configurazione dell’indice (Meilisearch)
In Meilisearch devi pre-registrare le colonne su cui filtri conwhere() in filterableAttributes e quelle su cui ordini con orderBy() in sortableAttributes.
>, < ecc.) solo su dati del tipo corretto.
scout:sync-index-settings.
Ricerca semantica e ibrida (Meilisearch)
Per usare la ricerca semantica o ibrida con Meilisearch, configura un embedder nelle impostazioni dell’indice e le informazioni di embedding nelle impostazioni del modello.toSearchableEmbedding del modello restituisce il testo sorgente da trasformare in embedding con il Laravel AI SDK, oppure un array di embedding precalcolato. Dopo aver aggiornato 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..env.
toSearchableArray devi castare la primary key a stringa e la data di creazione a timestamp UNIX.
Ricerca semantica e ibrida (Typesense)
Per abilitare la ricerca semantica e ibrida con Typesense, definisci nelle impostazioni Typesense del modello la configurazioneembedding e il campo vettoriale. Per impostazione predefinita Scout usa il Laravel AI SDK per generare gli embedding.
toSearchableEmbedding del modello restituisce il testo sorgente da trasformare in embedding con Scout, oppure un array di embedding precalcolato.
Se usi la funzione di embedding nativa di Typesense, puoi generare gli embedding anche senza il Laravel AI SDK. Per i dettagli consulta la documentazione ufficiale di Typesense.
Turbopuffer
Turbopuffer è un motore di ricerca che supporta la ricerca full-text, semantica e ibrida. Per usare il driver Turbopuffer, impostaSCOUT_DRIVER e la tua API key.
TURBOPUFFER_REGION è facoltativa e il valore predefinito è gcp-us-central1.
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 clausolaLIKE. Per la maggior parte delle applicazioni è sufficiente.
Ricerca semantica e ibrida
L’engine database supporta la ricerca semantica e ibrida con PostgreSQL e l’estensionepgvector. Aggiungi alla tabella del modello una colonna vettoriale nullable e un indice full-text. Scout salva gli embedding dopo il salvataggio del modello, quindi la colonna vettoriale deve essere nullable.
toSearchableEmbedding che restituisca il testo sorgente da trasformare in embedding oppure un array di embedding precalcolato. Di default Scout salva gli embedding nella colonna embedding; per usare un’altra colonna definisci il metodo searchableEmbeddingColumn.
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.
Configurazione di Turbopuffer
Con Turbopuffer, definisci per ogni modello gli attributi ricercabili e uno schema nell’arraymodel-settings di config/scout.php.
searchable-attributes sono pesi relativi BM25: nell’esempio, una corrispondenza nel titolo contribuisce al punteggio tre volte più di una nel corpo. Per usare la ricerca semantica, aggiungi la configurazione embedding e lo schema del vettore, e fai restituire al metodo toSearchableEmbedding del modello il testo sorgente o un array di embedding.
toSearchableEmbedding non sono necessari: includi l’attributo sorgente dell’embedding nel valore restituito da toSearchableArray e configura come segue.
Trait Searchable
Personalizzare toSearchableArray()
Per default, l’intero risultato ditoArray() 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 sovrascrivendosearchableAs.
Strategie di ricerca per l’engine database
Con l’engine database puoi indicare, tramite attributi PHP, una strategia di ricerca efficiente per colonna.Rendere ricercabili condizionalmente
Per rendere ricercabile un modello solo in certe condizioni, definiscishouldBeSearchable.
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 conscout:import.
Svuotare l’indice
Per rimuovere tutti i record del modello dall’indice usascout:flush.
Pausa dell’indicizzazione
Per interrompere temporaneamente la sincronizzazione con l’indice durante operazioni Eloquent, usawithoutSyncingToSearch.
Aggiunta / rimozione manuale
Puoi aggiungere all’indice una collezione di modelli tramite query.unsearchable.
delete di un modello lo rimuove automaticamente anche dall’indice.
Ricerca
Consearch cerchi sul modello. Concatena get per ottenere una collezione di modelli Eloquent.
raw.
Ricerca semantica
Con gli enginedatabase, Meilisearch, Typesense e Turbopuffer configurati per gli embedding puoi cercare i record in base al significato della query. Aggiungi il metodo semantic alla query di ricerca. Quando è Scout a generare gli embedding, la ricerca semantica e quella ibrida richiedono il Laravel AI SDK. Se invece usi gli embedding nativi di Typesense, gli embedding nativi di Turbopuffer o vettori di query precalcolati, il Laravel AI SDK non è necessario.
hybrid. Gli argomenti controllano i pesi relativi dei risultati testuali e semantici.
Paginazione
Conpaginate puoi paginare i risultati come nelle query Eloquent normali.
simplePaginate, più efficiente su grandi dataset perché non calcola il totale.
Filtri e ordinamento
Conwhere aggiungi condizioni di filtro alla query di ricerca.
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 inquery con with().
makeAllSearchableUsing.
Soft delete
Se il modello indicizzato usa il soft delete e vuoi cercare anche i modelli cancellati, imposta l’opzionesoft_delete in config/scout.php a true.
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 astrattaLaravel\Scout\Engines\Engine e deve implementare questi otto metodi.
Laravel\Scout\Engines\AlgoliaEngine.
L’engine personalizzato si registra su Scout nel metodo boot di App\Providers\AppServiceProvider.
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.