Laravel-scout: эластичный поиск с переводимыми объектами (astrotomic / laravel-translatable)

#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'
            ],
            ...
        ]
    ];