Как мне управлять многоязычными индексами (например: page / page_translations модели должны стать page_en / page_fr индексы). Я использую «Dimsav \ Translatableпакет
Модель страницы: id, status_id, создал_, обновил_
Модель PageTranslation: id, page_id, locale, title, slug, body
Algolia предлагает поддержку для этого (https://www.algolia.com/doc/guides/search/multilingual-search/) но я не уверен, как этого добиться с Laravel Scout.
Единственное решение, которое приходит мне в голову, — это индексировать обе строки языка (из модели переводов) в одном индексе, сохраняя локаль и применяя условие поиска.
Algolia
objectID = 1, title = ‘английское название’, locale_id = ‘1’
objectID = 2, title = ‘Franch title’, locale_id = ‘2’
$pages = App\PageTranslation::search('Star Trek')->where('locale_id', 1)->get();
Или, может быть, лучший подход? Может быть, индексировать page / page_translations отдельно и искать в обоих?
Я хотел бы добиться чего-то вроде:
pages_en index: objectID = 1, title = ‘английское название’ и т. д.
pages_fr index: objectID = 2, title = ‘Franch title’ и т. д.
$pages = App\Page::search('Star Trek')->where('locale', 'en')->get();
Я много думал об этом, и я думаю, что наилучшим способом было бы использовать 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"}
}
Обратите внимание, что в Алголии установлен лимит в 10 КБ на записи. Лучший способ справиться с этим — обрезать ваши самые большие атрибуты. Не волнуйся, это не влияет на актуальность. Если вы пропустите вторую половину своей статьи, обычно весь соответствующий контент уже находится на первом месте.
Затем перейдите на панель инструментов и добавьте 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 с вашими ограничениями.
Пожалуйста, дайте мне знать, что вы думаете 🙂
Других решений пока нет …