sql >> Database >  >> RDS >> Mysql

Meertalige indexen met Laravel Scout en Algolia

Ik heb er veel over nagedacht en ik denk dat de beste manier zou zijn om 1 index per model te gebruiken en voordeel te halen uit de callback die je kunt doorgeven aan ::search()

Gegevens indexeren

Eerst moet je toSearchableArray() . gebruiken om de gegevens voor te bereiden. Ik zou alle onnodige attributen (zoals datums) uitschakelen en vervolgens de inhoud nesten onder de 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"
  }
}

Houd er rekening mee dat Algolia een limiet van 10 KB per record heeft. De beste manier om hiermee om te gaan, is door uw grootste attributen in te korten. Maak je geen zorgen, het heeft geen invloed op de relevantie . Als je de tweede helft van je artikel mist, staat alle relevante inhoud meestal al in de eerste helft.

Algolia-configuratie instellen in dashboard

Ga dan naar je dashboard en voeg fr . toe en en naar de searchableAttributes .

Zoeken

U kunt searchableAttributes beperken op het moment van de vraag met een terugbelverzoek doorgegeven aan de zoekopdracht

$lang = 'en';
Model::search($query, function ($algolia, $query, $options) use ($lang) {
    $options = array_merge($options, [
        'restrictSearchableAttributes' => [$lang],
    ]);

    return $algolia->search($query, $options);
});

Ik heb een eigenschap gemaakt om iets soortgelijks te bereiken . Misschien kun je iets soortgelijks doen om een ​​gebruiksvriendelijke syntaxis te krijgen zoals:

Model::searchLang($lang, $query);

Na al het denken, denk ik echt dat dit de minst hacky manier is om Laravel Scout te gebruiken met je beperkingen.

Laat me alsjeblieft weten wat je ervan vindt :)




  1. Meerdere rijen samenvoegen tot één rij

  2. MySQL High Availability Framework uitgelegd – Deel I:Inleiding

  3. Meerdere tabellen samenvoegen in SQL

  4. Python-, MySQL- en SELECT-uitvoer naar woordenboek met kolomnamen voor sleutels