8

我应该如何管理多语言索引(例如: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实现这一点。

我想到的唯一解决方案是将两种语言行(来自翻译模型)索引在存储语言环境的同一索引中并在搜索中应用条件。

阿尔及利亚

objectID=1, title='英文标题', locale_id='1'

objectID=2, 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索引:objectID=2,title='Franch title'等。

$pages = App\Page::search('Star Trek')->where('locale', 'en')->get();

4

1 回答 1

13

我想了很多,我认为最好的方法是每个模型使用 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添加ensearchableAttributes.

搜索

您可以searchableAttributes在查询时通过传递给搜索的回调来限制

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

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

我创建了一个 trait 来实现类似的东西。也许您可以做类似的事情,以获得易于使用的语法,例如:

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

经过所有的思考,我真的认为这是在约束条件下使用 Laravel Scout 的最简单的方法。

请让我知道你的想法 :)

于 2017-05-24T09:15:54.063 回答