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