Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mehrsprachige Indizes mit Laravel Scout und Algolia

Ich habe viel darüber nachgedacht und ich denke, der beste Weg wäre, 1 Index pro Modell zu verwenden und den Rückruf zu nutzen, den Sie an ::search() übergeben können

Indizierung von Daten

Zuerst müssen Sie toSearchableArray() verwenden um die Daten aufzubereiten. Ich würde alle unnötigen Attribute (wie Datumsangaben) zurücksetzen und dann den Inhalt unter seiner ISO verschachteln.

{
  objectID: 1,
  en: {
    title: "Title in english",
    body: "trucated body in english"
  },
  fr: {
    title: "Titre en français",
    body: "contenu tronqué en français"
  }
}

Bitte beachten Sie, dass Algolia ein Limit von 10 KB pro Datensatz hat. Der beste Weg, damit umzugehen, besteht darin, Ihre größten Attribute zu kürzen. Keine Sorge, das wirkt sich nicht auf die Relevanz aus . Wenn Sie die zweite Hälfte Ihres Artikels verpassen, sind in der Regel alle relevanten Inhalte bereits im ersten Teil enthalten.

Algolia-Konfiguration im Dashboard einrichten

Gehen Sie dann zu Ihrem Dashboard und fügen Sie fr hinzu und en zu den searchableAttributes .

Suchen

Sie können searchableAttributes einschränken zur Abfragezeit mit einem an die Suche übergebenen Callback

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

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

Ich habe eine Eigenschaft erstellt, um etwas Ähnliches zu erreichen . Vielleicht können Sie etwas Ähnliches tun, um eine einfach zu verwendende Syntax wie:

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

Nach all dem Nachdenken denke ich wirklich, dass es die am wenigsten hackige Art ist, Laravel Scout mit Ihren Einschränkungen zu verwenden.

Bitte lassen Sie mich wissen, was Sie denken :)