J'y ai beaucoup réfléchi et je pense que la meilleure façon serait d'utiliser 1 index par modèle et de profiter du rappel que vous pouvez passer à ::search()
Indexation des données
Vous devez d'abord utiliser toSearchableArray()
pour préparer les données. Je supprimerais tous les attributs inutiles (comme les dates) puis imbriquerais le contenu sous son 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"
}
}
Veuillez noter qu'Algolia a une limite de 10 Ko par enregistrement. La meilleure façon de gérer cela est de tronquer vos plus grands attributs. Ne vous inquiétez pas, cela n'affecte pas la pertinence . Si vous manquez la seconde moitié de votre article, tout le contenu pertinent se trouve généralement déjà dans la première partie.
Configurer la configuration d'Algolia dans le tableau de bord
Rendez-vous ensuite sur votre tableau de bord et ajoutez en
et en
aux searchableAttributes
.
Rechercher
Vous pouvez restreindre les searchableAttributes
au moment de la requête avec un callback passé à la recherche
$lang = 'en';
Model::search($query, function ($algolia, $query, $options) use ($lang) {
$options = array_merge($options, [
'restrictSearchableAttributes' => [$lang],
]);
return $algolia->search($query, $options);
});
J'ai créé un trait pour obtenir quelque chose de similaire . Vous pouvez peut-être faire quelque chose de similaire, afin d'avoir une syntaxe facile à utiliser comme :
Model::searchLang($lang, $query);
Après toute la réflexion, je pense vraiment que c'est la façon la moins compliquée d'utiliser Laravel Scout avec vos contraintes.
N'hésitez pas à me dire ce que vous en pensez :)