Mysql
 sql >> Base de données >  >> RDS >> Mysql

Index multilingues avec Laravel Scout et Algolia

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 :)