A FIELD GUIDE TO LARAVEL · VOLUME II · THE ECOSYSTEM
ENTRY II.12 · SEARCH
Scout
Laravel\Scout · Package · first recorded 15 August 2016, v0.1.0 on Packagist; with Laravel 5.3
Driver-based full-text search for Eloquent models. A trait keeps an index in step with the table, and one query API covers the database itself, Meilisearch, Typesense, Algolia and Turbopuffer. Semantic and hybrid search from 2026.
Specification
Kind Package, in-process. Model observers plus an engine
Driver database, collection, meilisearch, typesense, algolia, turbopuffer
Client Eloquent: Post::search('...'), ->semantic(), ->paginate()
Installed by composer require laravel/scout · vendor:publish · use Searchable
Voice scout:import · scout:flush · scout:sync-index-settings
Scales by Queued index jobs; unique jobs for write-heavy tables
Range Cloud: yes. The database driver needs nothing extra
Forge, VPS: yes, the same; Meilisearch or Typesense self-hosted
Vapor: yes. Indexing is a job, no process to run
Neighbours
Scout's database engine searches MySQL or PostgreSQL directly, through full-text indexes and LIKE clauses, with no extra service; the query builder's whereFullText does a similar job without the package. Scout's distinction is one API across engines, with an index a trait keeps in step with the table.
Field marks
SCOUT_DRIVER=database
config/scout.php
use Searchable; on a model
toSearchableArray()
Fig. II.12.1 · one record into the index, exploded
Parts
1 Searchable trait. On the model. Registers an observer, so save, delete and forceDelete reach the index without a call.
2 Searchable array. toSearchableArray picks the fields; toSearchableEmbedding the text to embed. shouldBeSearchable gates it.
3 Queue, optional. 'queue' => true makes each sync a job; MakeSearchableUniquely stops duplicates piling up.
4 Engine. The driver named in SCOUT_DRIVER. database and collection need no service; the rest need an engine to reach.
5 Index. One per model, named by searchableAs; the database engine skips this and searches the table itself.
6 Search. Post::search('q')->where(...)->paginate(). The engine returns ids, Eloquent loads them. semantic() for meaning.
Hidden joinery
Soft-deleted rows stay in the index as a hidden __soft_deleted field when soft_delete is true, so withTrashed works in search too. withoutSyncingToSearch wraps a bulk operation. Global scopes never reach the engine, so a paginated search can count rows the scope would hide. Typesense wants its schema declared in config first.
Every line checked on 2026-10-08 against the 13.x docs, the laravel/scout source, Packagist and The Monitor.
TITLE
Scout · one record into the index
SOURCES
laravel.com/docs/13.x/scout · laravel.com/docs/13.x/queries · github.com/laravel/scout · packagist.org/packages/laravel/scout · laravel.com/blog/laravel-august-product-updates · laravel.com/blog/laravel-september-product-updates · Monitor 460, 549, 439
STATUS
Verified · 2026-10-08
SHEET
II.12 of 48
REV
A · 2026-10-08
DRAWN
BS
FINISH
All faces, including the back