Мислех за това много и мисля, че най-добрият начин би бил да използвате 1 индекс на модел и да се възползвате от обратното извикване, което можете да предадете на ::search()
Индексиране на данни
Първо трябва да използвате toSearchableArray()
да подготви данните. Бих премахнал всички ненужни атрибути (като дати), след което бих вложил съдържание под неговия 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"
}
}
Моля, имайте предвид, че Algolia има ограничение от 10KB на запис. Най-добрият начин да се справите с това е да съкратите най-големите си атрибути. Не се притеснявайте, това не влияе на уместността . Ако пропуснете втората половина на статията си, обикновено цялото подходящо съдържание вече е в първата част.
Настройте конфигурацията на Algolia в таблото за управление
След това се насочете към таблото си и добавете fr
и en
към searchableAttributes
.
Търсене
Можете да ограничите searchableAttributes
по време на заявка с обратно извикване, предадено на търсенето
$lang = 'en';
Model::search($query, function ($algolia, $query, $options) use ($lang) {
$options = array_merge($options, [
'restrictSearchableAttributes' => [$lang],
]);
return $algolia->search($query, $options);
});
Създадох черта за постигане на нещо подобно . Може би можете да направите нещо подобно, за да имате лесен за използване синтаксис като:
Model::searchLang($lang, $query);
След цялото мислене, наистина мисля, че това е най-малко хакерският начин да използвате Laravel Scout с вашите ограничения.
Моля, уведомете ме какво мислите :)