Laravel Scout с TNTSearch

Я использую Laravel Scout для замены своей функции поиска, поскольку ранее это был один большой оператор SQL LIKE, подобный приведенному ниже.

$users = User::where('username', 'like', '%'.$request->get('q').'%')
    ->orWhere('displayName', 'like', '%'.$request->get('q').'%')
    ->orWhere('email', 'like', '%'.$request->get('q').'%')
    ->orWhere('role', 'like', '%'.$request->get('q').'%')
    ->orWhere('department', 'like', '%'.$request->get('q').'%')
    ->orWhere('location', 'like', '%'.$request->get('q').'%')
    ->orWhere('directDialIn', 'like', '%'.$request->get('q').'%')
    ->orWhere('mobileNumber', 'like', '%'.$request->get('q').'%')
    ->get();

Я делал это для нескольких моделей, которые у меня есть, таких как Article, Event и т. Д., И в итоге сценарий получился раздутым. Я выполнил необходимые шаги в документации и настроил Laravel Scout для использования TNTSearch, используя предоставленный ими пакет Laravel.

В документации Laravel говорится, что Laravel Scout не так хорош в продвинутых предложениях where, поэтому, следуя документации немного дальше по странице, я сделал что-то подобное в верхней части своего контроллера.

use Searchable;

public function shouldBeSearchable()
{
    return $this->published === "open";
}

/**
 * Get the indexable data array for the model.
 *
 * @return array
 */
public function toSearchableArray()
{
    $array = $this->toArray();

    // Customize array...

    return $array;
}

Он должен возвращать только те модели, где опубликованные равны 'open' в моей таблице базы данных (по крайней мере, я так думал). Однако я запускаю следующую команду:

php artisan scout:import "App\Article"

Затем выполните поиск, он по-прежнему возвращает закрытые статьи. Я думал, что определение shouldBeSearchable предотвратит это?

Кроме того, можно ли индексировать отношения в модели при выполнении поиска Scout? Например, если у пользователя есть профиль, могу ли я использовать Scout для поиска в профиле, относящемся к пользователю? Я хочу иметь возможность вводить текст в поле, а Scout сканировать текст и возвращать пользователя, которому принадлежит профиль.


person Jesse Orange    schedule 16.05.2018    source источник


Ответы (1)


Я предполагаю, что вы используете teamtnt / laravel-scout-tntsearch-driver? Если это так, то он еще не поддерживает функцию Scout shouldBeSearchable.

Вот соответствующая проблема: https://github.com/teamtnt/laravel-scout-tntsearch-driver/issues/153.

person EmGee    schedule 16.05.2018
comment
Значит, мне буквально придется удалить индексы, написать методы, а затем импортировать таблицы? - person Jesse Orange; 16.05.2018
comment
Судя по всему, вам придется самостоятельно расширить его для поддержки shouldBeSearchable, подождать, пока они расширят его, или использовать другой драйвер поиска. - person EmGee; 16.05.2018
comment
Вы также можете написать собственный индексатор, который будет намного быстрее, чем тот, который используется laravel scout, но при этом будет совместим с scout. - person Nenad; 17.05.2018