[英]Multi-language indexes with Laravel Scout and Algolia
我应该如何管理多语言索引(例如: 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个索引,并采用你可以传递给::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。 处理此问题的最佳方法是截断您的最大属性。 别担心, 它不会影响相关性 。 如果您错过了文章的后半部分,通常所有相关内容都已经在第一个文章中。
然后前往仪表板并将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和你的约束的最少hacky方式。
请让我知道你的想法 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.