Laravel Scout和Algolia的多语言索引

我应该如何管理多语言索引(例如:页面/页面翻译模型应该成为页面/页面索引)。我正在使用“dimsav\translatable”软件包。
页面模型:id,状态id,已创建,已更新
页面翻译模型:id,页面id,区域设置,标题,slug,正文
Algolia对此提供支持(https://www.algolia.com/doc/guides/search/multilingual-search/),但我不确定如何通过Laravel Scout实现这一点。
我想到的唯一解决方案是将两个语言行(来自翻译模型)索引到存储区域设置的同一索引中,并在搜索时应用条件。
阿尔戈利亚
objectid=1,title='英文title',locale\u id='1'
objectid=2,title='franch title',locale\u id='2'
$pages = App\PageTranslation::search('Star Trek')->where('locale_id', 1)->get();
或者更好的方法?或许可以单独索引页面/页面翻译并在两者中搜索?
我想实现如下目标:
页面索引:objectid=1,title='英文标题',等等。
页面索引: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"
  }
}

请注意,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);

经过所有的思考,我真的认为这是最不黑的方式使用拉维尔球探与你的限制。
请告诉我你的想法:)

评论