Dużo o tym myślałem i myślę, że najlepszym sposobem byłoby użycie 1 indeksu na model i skorzystanie z funkcji zwrotnej, którą możesz przekazać do ::search()
Indeksowanie danych
Najpierw musisz użyć toSearchableArray()
do przygotowania danych. Usunąłbym wszystkie niepotrzebne atrybuty (takie jak daty), a następnie zagnieździł zawartość pod jego 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"
}
}
Należy pamiętać, że Algolia ma limit 10 KB na rekord. Najlepszym sposobem na poradzenie sobie z tym jest skrócenie największych atrybutów. Nie martw się, nie ma to wpływu na trafność . Jeśli przegapisz drugą połowę artykułu, zwykle cała istotna treść jest już w pierwszej połowie.
Skonfiguruj konfigurację Algolii w panelu
Następnie przejdź do panelu i dodaj fr
i en
do searchableAttributes
.
Szukaj
Możesz ograniczyć searchableAttributes
w czasie zapytania z wywołaniem zwrotnym przekazanym do wyszukiwania
$lang = 'en';
Model::search($query, function ($algolia, $query, $options) use ($lang) {
$options = array_merge($options, [
'restrictSearchableAttributes' => [$lang],
]);
return $algolia->search($query, $options);
});
Stworzyłem cechę, aby osiągnąć coś podobnego . Może możesz zrobić coś podobnego, aby mieć łatwą w użyciu składnię, taką jak:
Model::searchLang($lang, $query);
Po całym tym myśleniu naprawdę uważam, że jest to najmniej chwytliwy sposób wykorzystania Laravel Scout z ograniczeniami.
Daj mi znać, co myślisz :)