Lo pensé mucho y creo que la mejor manera sería usar 1 índice por modelo y aprovechar la devolución de llamada que puede pasar a ::search()
Indización de datos
Primero necesitas usar toSearchableArray()
para preparar los datos. Quitaría todos los atributos innecesarios (como las fechas) y luego anidaría el contenido en su ISO.
{
objectID: 1,
en: {
title: "Title in english",
body: "trucated body in english"
},
fr: {
title: "Titre en français",
body: "contenu tronqué en français"
}
}
Tenga en cuenta que Algolia tiene un límite de 10 KB por registro. La mejor manera de manejar esto es truncar sus mayores atributos. No te preocupes, no afecta la relevancia . Si se pierde la segunda mitad de su artículo, normalmente todo el contenido relevante ya está en la primera mitad.
Configurar la configuración de Algolia en el panel
Luego dirígete a tu tablero y agrega fr
y en
a los searchableAttributes
.
Buscar
Puede restringir searchableAttributes
en el momento de la consulta con una devolución de llamada pasada a la búsqueda
$lang = 'en';
Model::search($query, function ($algolia, $query, $options) use ($lang) {
$options = array_merge($options, [
'restrictSearchableAttributes' => [$lang],
]);
return $algolia->search($query, $options);
});
Creé un rasgo para lograr algo similar . Tal vez pueda hacer algo similar para tener una sintaxis fácil de usar como:
Model::searchLang($lang, $query);
Después de pensarlo mucho, realmente creo que es la forma menos complicada de usar Laravel Scout con tus limitaciones.
Por favor, hazme saber lo que piensas :)