#laravel #elasticsearch #laravel-scout
#laravel #elasticsearch #laravel-scout
Вопрос:
Я пытаюсь использовать «babenkoivan / scout-elasticsearch-driver» с «astrotomic / laravel-translatable», но я не понимаю, как я мог бы индексировать переведенные слова.
Моя модель выглядит так :
namespace AppModels;
use AstrotomicTranslatableTranslatable;
use AppModelsSearchShowIndexConfigurator;
use ScoutElasticSearchable;
...
class Show extends BaseModel
{
...
use Translatable;
use Searchable;
protected $indexConfigurator = ShowIndexConfigurator::class;
protected $searchRules = [
//
];
protected $mapping = [
'properties' => [
// How to index localized translations ???
'title' => [
'type' => 'string'
],
]
];
....
public $translatedAttributes = [
...,
'title'
...
];
С наилучшими пожеланиями
Ответ №1:
Я нашел решение с переопределением метода public function toSearchableArray()
чем-то вроде:
public function toSearchableArray(): array
{
$document = [];
if ($this->published) {
$document = [
//...
];
foreach ($this->translations()->get() as $translation)
{
if (!$translation->active) {
continue;
}
$locale = $translation->locale;
$document['title_' . $locale] = $translation->title;
$document['url_' . $locale] = $this->getLink($locale);
$document['sub_title_' . $locale] = $translation->sub_title;
$document['keywords_' . $locale] = "";
}
}
return $document;
}
Цель $mapping=[]
состоит только в том, чтобы определить структуру данных. Ожидается что-то подобное:
protected $mapping = [
'properties' => [
'title_en' => [
'type' => 'string'
],
'title_fr' => [
'type' => 'string'
],
...
]
];