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 motordatabase 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.vendor:publish. Se generará config/scout.php.
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 dedatabase 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.
Usar jobs únicos
En aplicaciones con mucha escritura te puede interesar evitar encolar varias veces el mismo job para el mismo modelo. Registra las clasesMakeSearchableUniquely y RemoveFromSearchUniquely en config/scout.php (normalmente en el método boot de un service provider).
Requisitos por driver
Algolia
Configura las credencialesid y secret en config/scout.php e instala el SDK PHP de Algolia.
.env:
Configuración del índice
Con Algolia puedes gestionar los ajustes del índice desdeconfig/scout.php.
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..env.
Configuración del índice (Meilisearch)
Con Meilisearch necesitas declarar de antemano enfilterableAttributes las columnas por las que vas a filtrar con where(), y en sortableAttributes las que usarás con orderBy().
>, <, etc.) sobre datos con el tipo correcto.
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..env.
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 motordatabase aprovecha los índices full-text y LIKE de MySQL/PostgreSQL. Suficiente para la mayoría de aplicaciones.
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). SobrescribesearchableAs 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.Hacer buscable de forma condicional
Para que un modelo solo sea buscable bajo cierta condición, defineshouldBeSearchable.
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 conscout:import.
Vaciar el índice
Para eliminar del índice todos los registros de un modelo, usascout:flush.
Pausar la sincronización
Para desactivar temporalmente la sincronización durante operaciones Eloquent, usawithoutSyncingToSearch.
Añadir y eliminar registros manualmente
Puedes indexar colecciones a partir de una query.unsearchable.
delete, también se elimina del índice automáticamente.
Búsqueda
Consearch haces búsquedas. Encadena get para obtener una colección de modelos Eloquent.
raw.
Paginación
Conpaginate obtienes resultados paginados igual que con una query Eloquent normal.
simplePaginate, que es más eficiente en grandes volúmenes porque no calcula el total.
Filtros y orden
Conwhere añades filtros a la búsqueda.
query.
Eager loading
Scout obtiene los IDs del motor y luego consulta Eloquent. Para evitar el problema N+1, indica el eager loading enquery.
makeAllSearchableUsing.
Soft delete
Si el modelo indexado usa soft delete y quieres poder buscar también registros eliminados, ponsoft_delete a true en config/scout.php.
withTrashed y onlyTrashed.
Motores personalizados
Si ninguno de los motores integrados encaja, puedes implementar el tuyo. Debes extender la clase abstractaLaravel\Scout\Engines\Engine e implementar los ocho métodos siguientes.
Laravel\Scout\Engines\AlgoliaEngine.
Registra tu motor en el método boot de App\Providers\AppServiceProvider.
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.