Mysql
 sql >> Database >  >> RDS >> Mysql

Indici multilingua con Laravel Scout e Algolia

Ci ho pensato molto e penso che il modo migliore sarebbe usare 1 indice per modello e sfruttare il callback che puoi passare a ::search()

Indicizzazione dei dati

Per prima cosa devi usare toSearchableArray() per preparare i dati. Vorrei annullare tutti gli attributi non necessari (come le date), quindi annidare il contenuto sotto il suo 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"
  }
}

Tieni presente che Algolia ha un limite di 10 KB per record. Il modo migliore per gestirlo è troncare i tuoi attributi più grandi. Non preoccuparti, non ha alcun impatto sulla pertinenza . Se perdi la seconda metà del tuo articolo, di solito tutto il contenuto rilevante è già nella prima parte.

Imposta la configurazione di Algolia nella dashboard

Quindi vai alla tua dashboard e aggiungi fr e en a searchableAttributes .

Cerca

Puoi limitare searchableAttributes al momento della query con una richiamata passata alla ricerca

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

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

Ho creato un tratto per ottenere qualcosa di simile . Forse puoi fare qualcosa di simile, in modo da avere una sintassi facile da usare come:

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

Dopo tutte le riflessioni, penso davvero che sia il modo meno complicato di usare Laravel Scout con i tuoi vincoli.

Per favore fatemi sapere cosa ne pensate :)