Многоязычные индексы с Laravel Scout и Algolia

Как мне управлять многоязычными индексами (например: 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();

6

Решение

Я много думал об этом, и я думаю, что наилучшим способом было бы использовать 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 КБ на записи. Лучший способ справиться с этим — обрезать ваши самые большие атрибуты. Не волнуйся, это не влияет на актуальность. Если вы пропустите вторую половину своей статьи, обычно весь соответствующий контент уже находится на первом месте.

Настройка конфигурации 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 с вашими ограничениями.

Пожалуйста, дайте мне знать, что вы думаете 🙂

11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]