Skip to main content

Introducción

Laravel Scout es una solución sencilla basada en drivers para añadir búsqueda de texto completo a los modelos Eloquent. Utiliza observers para mantener sincronizados los registros Eloquent con los índices de búsqueda. Scout incluye un motor database integrado que utiliza índices full-text de MySQL/PostgreSQL y la cláusula LIKE para buscar directamente sobre la base de datos, sin necesidad de servicios externos. En entornos de producción grandes en los que necesitas tolerancia a erratas, faceting o búsqueda geográfica, los motores externos son de gran ayuda.

Motores compatibles

Instalación

Instala el paquete con Composer.
Después publica el archivo de configuración con vendor:publish. Se generará config/scout.php.
Por último, añade el trait Laravel\Scout\Searchable a los modelos que quieres hacer buscables. El trait registra los observers y activa la sincronización automática con el driver de búsqueda.

Configuración de la cola

Si usas cualquier motor distinto de database o collection, es muy recomendable configurar un driver de colas antes de utilizar Scout. Con un worker corriendo, la sincronización del índice se ejecuta en segundo plano y la interfaz web es mucho más ágil. Pon queue a true en config/scout.php.
También puedes indicar conexión y nombre de cola.
Después arranca un worker dedicado.

Usar jobs únicos

En aplicaciones con mucha escritura te puede interesar evitar encolar varias veces el mismo job para el mismo modelo. Registra las clases MakeSearchableUniquely y RemoveFromSearchUniquely en config/scout.php (normalmente en el método boot de un service provider).
Estos jobs se apoyan en los locks de jobs únicos de Laravel para no despachar operaciones duplicadas sobre el mismo modelo.

Requisitos por driver

Algolia

Configura las credenciales id y secret en config/scout.php e instala el SDK PHP de Algolia.
En .env:

Configuración del índice

Con Algolia puedes gestionar los ajustes del índice desde config/scout.php.
Después ejecuta scout:sync-index-settings para aplicarlos.

Meilisearch

Meilisearch es un motor de búsqueda open source muy rápido. En desarrollo local lo más cómodo es la imagen Docker de Laravel Sail.
Sin Sail puedes arrancarlo directamente con Docker.
Instala el SDK PHP.
Configura el driver y el host en .env.
Al actualizar Scout revisa siempre los cambios que rompen la compatibilidad del propio Meilisearch.

Configuración del índice (Meilisearch)

Con Meilisearch necesitas declarar de antemano en filterableAttributes las columnas por las que vas a filtrar con where(), y en sortableAttributes las que usarás con orderBy().
Presta atención a los tipos numéricos: Meilisearch solo puede aplicar operadores (>, <, etc.) sobre datos con el tipo correcto.
Después ejecuta scout:sync-index-settings.

Typesense

Typesense es un motor open source rápido que soporta búsqueda por palabra clave, semántica, geo y vectorial.
Configura la conexión en .env.
Con Typesense, en toSearchableArray debes convertir la clave primaria a string y la fecha de creación a timestamp UNIX.

Motores database y collection

Ideales si quieres añadir búsqueda sin servicios externos. El motor database aprovecha los índices full-text y LIKE de MySQL/PostgreSQL. Suficiente para la mayoría de aplicaciones.
El motor collection filtra en PHP, así que funciona con cualquier base de datos soportada por Laravel, incluida SQLite. Ideal para desarrollo, tests y conjuntos pequeños.
Con el motor database no necesitas gestionar índices manualmente: busca directamente contra la tabla.

Trait Searchable

Personalizar toSearchableArray()

Por defecto se indexa todo lo que devuelve toArray(). Para personalizarlo, sobrescribe toSearchableArray.

Personalizar el nombre del índice

Por defecto se usa el nombre de la tabla (en plural). Sobrescribe searchableAs para cambiarlo.

Estrategias de búsqueda para el motor database

En el motor database puedes indicar, por columna, la estrategia más eficiente mediante atributos PHP.
Antes de usar SearchUsingFullText, asegúrate de tener un índice full-text sobre esa columna.

Hacer buscable de forma condicional

Para que un modelo solo sea buscable bajo cierta condición, define shouldBeSearchable.
shouldBeSearchable no funciona con el motor database. Para conseguir el mismo comportamiento allí, utiliza cláusulas where.

Gestión del índice

Los comandos de esta sección son relevantes principalmente para motores externos (Algolia, Meilisearch, Typesense…). En el motor database no hace falta gestionar el índice.

Importar registros existentes

Al añadir Scout a un proyecto ya existente, importa los registros con scout:import.
Puedes hacerlo en segundo plano mediante la cola.

Vaciar el índice

Para eliminar del índice todos los registros de un modelo, usa scout:flush.

Pausar la sincronización

Para desactivar temporalmente la sincronización durante operaciones Eloquent, usa withoutSyncingToSearch.

Añadir y eliminar registros manualmente

Puedes indexar colecciones a partir de una query.
Para quitar registros del índice, unsearchable.
Cuando eliminas un modelo con delete, también se elimina del índice automáticamente.

Búsqueda

Con search haces búsquedas. Encadena get para obtener una colección de modelos Eloquent.
Si lo devuelves desde un controlador o ruta, se serializa a JSON automáticamente.
Para los resultados en crudo, raw.

Paginación

Con paginate obtienes resultados paginados igual que con una query Eloquent normal.
En el motor database puedes usar simplePaginate, que es más eficiente en grandes volúmenes porque no calcula el total.
Ejemplo en Blade:

Filtros y orden

Con where añades filtros a la búsqueda.
Con Meilisearch necesitas declarar los atributos filtrables antes de usar where.
También puedes personalizar la query Eloquent con query.

Eager loading

Scout obtiene los IDs del motor y luego consulta Eloquent. Para evitar el problema N+1, indica el eager loading en query.
Para cargar relaciones durante la importación masiva, define makeAllSearchableUsing.
makeAllSearchableUsing puede no aplicarse durante importaciones por cola: cuando el job procesa la colección de modelos, las relaciones no se restauran.

Soft delete

Si el modelo indexado usa soft delete y quieres poder buscar también registros eliminados, pon soft_delete a true en config/scout.php.
Con esto puedes usar withTrashed y onlyTrashed.

Motores personalizados

Si ninguno de los motores integrados encaja, puedes implementar el tuyo. Debes extender la clase abstracta Laravel\Scout\Engines\Engine e implementar los ocho métodos siguientes.
Como referencia, revisa la clase Laravel\Scout\Engines\AlgoliaEngine. Registra tu motor en el método boot de App\Providers\AppServiceProvider.
Después indícalo como driver en config/scout.php.

Páginas relacionadas

Eloquent ORM

Repasa el uso básico de los modelos Eloquent.

Relaciones Eloquent

Cómo definir relaciones y aplicar eager loading.

Colas

Scout puede actualizar el índice en segundo plano usando colas.
Última modificación el 20 de julio de 2026