Laravel Scout和Algolia的多语言索引

时间:2017-05-19 13:11:20

标签: php mysql laravel-5.3 algolia laravel-scout

我应该如何管理多语言索引(例如: page / page_translations 模型应该变为 page_en / page_fr 索引)。我正在使用“ Dimsav \ Translatable ”包。

网页模型:id,status_id,created_at,updated_at

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 个答案:

答案 0 :(得分:11)

我考虑了很多,我认为最好的方法是每个模型使用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配置

然后转到信息中心,将fren添加到searchableAttributes

搜索

您可以在查询时限制searchableAttributes,并将回传传递给搜索

$lang = 'en';
Model::search($query, function ($algolia, $query, $options) use ($lang) {
    $options = array_merge($options, [
        'restrictSearchableAttributes' => [$lang],
    ]);

    return $algolia->search($query, $options);
});

我创建了a trait to achieve something similar。也许你可以做类似的事情,以便有一个易于使用的语法,如:

Model::searchLang($lang, $query);

经过深思熟虑之后,我真的认为这是使用Laravel Scout的最简单方法。

请让我知道你的想法:)