sql >> Databáze >  >> RDS >> Mysql

Vícejazyčné rejstříky s Laravel Scout a Algolia

Hodně jsem o tom přemýšlel a myslím, že nejlepším způsobem by bylo použít 1 index na model a využít zpětné volání, které můžete předat ::search()

Indexování dat

Nejprve musíte použít toSearchableArray() připravit data. Zrušil bych nastavení všech nepotřebných atributů (jako jsou data) a poté vnořil obsah pod jeho 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"
  }
}

Upozorňujeme, že Algolia má limit 10 kB na záznamy. Nejlepší způsob, jak to zvládnout, je zkrátit své největší atributy. Nemějte obavy, nemá to vliv na relevanci . Pokud zmeškáte druhou polovinu svého článku, obvykle je veškerý relevantní obsah již v první části.

Nastavte konfiguraci Algolia na řídicím panelu

Poté přejděte na hlavní panel a přidejte fr a en do searchableAttributes .

Hledat

Můžete omezit searchableAttributes v době dotazu se zpětným voláním předaným vyhledávání

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

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

Vytvořil jsem vlastnost, abych dosáhl něčeho podobného . Možná můžete udělat něco podobného, ​​abyste měli snadno použitelnou syntaxi jako:

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

Po tom všem přemýšlení si opravdu myslím, že je to ten nejméně náročný způsob, jak používat Laravel Scout s vašimi omezeními.

Dejte mi prosím vědět, co si myslíte :)




  1. Jak funguje DAYOFYEAR() v MariaDB

  2. PostgreSQL schémata / jmenné prostory s Django

  3. Jak vytvořit modul Nadcházející narozeniny v Rails?

  4. Datové sklady Profilování dat ETL pomocí Oracle Warehouse Builder