Laravel Scout: Как обновить индекс в контроллере

Вот мой вопрос Я хочу обновить индекс разведчика, сохраненный в хранилище моего контроллера. Есть идеи как это сделать?

я использую tntsearch пакет. Я знаю, что могу сделать команду ремесленника в командной строке с $ php artisan scout:import App\\Models\\Paper

Но я работаю над сайтом, на котором каждый может разместить свои журналы, и мне нужна мощная поисковая система на моем сайте. Поэтому в этой ситуации мне нужно обновлять индекс каждый раз, когда публикуется журнал. Так что каждый может искать в журналах.

Мне удается выполнить часть этой задачи, сделав поставщика TNTSearchScoutServiceProvider,

вот TNTSearchScoutServiceProvider:

class TNTSearchScoutServiceProvider extends \TeamTNT\Scout\TNTSearchScoutServiceProvider
{
public function boot()
{
$this->app[EngineManager::class]->extend('tntsearch', function ($app) {
$tnt = new TNTSearch();

$driver = config('database.default');
$config = config('scout.tntsearch') + config("database.connections.{$driver}");

$tnt->loadConfig($config);
$tnt->setDatabaseHandle(app('db')->connection()->getPdo());

$this->setFuzziness($tnt);
$this->setAsYouType($tnt);

return new TNTSearchEngine($tnt);
});// To allow us run commands if we're not running in the console
$this->commands([
ImportCommand::class,
]);
}
}

После добавления этого провайдера в config / app.php. В контроллере я использую провайдера, как это:

Artisan::call('tntsearch:import', ['model' => 'App\Models\Paper']);

Но это выбрасывает эту ошибку:

unlink(C:\wamp64\www\mywbsite\storage/papers.index): Resource temporarily unavailable

Вот что я делаю до сих пор:
хотя и выдает ошибку, но я могу получить только последнюю обновленную строку в результатах поиска, а самые старые строки не отображаются в результатах поиска.

Итак, каковы ваши предложения? Это лучший способ сделать это? Или я должен проверять сайт каждый день и запускать команды ремесленников, чтобы таблица могла быть проиндексирована?

2

Решение

Мне наконец-то удалось решить эту проблему:

для обновления индекса в хранилище вы просто создаете новый объект из класса TNTindexer; Сначала вы создаете этот индекс, а затем выбираете столбцы, которые хотите обновить, с помощью метода query (). затем запустите () индексатор. Перед этим обязательно загрузите конфигурацию. Вот метод, который я прямо на контроллере:

   protected function add_to_search(){

$indexer = new TNTIndexer;

$driver = config('database.default');
$config = config('scout.tntsearch') + config("database.connections.{$driver}");

$indexer->loadConfig($config);

$indexer->createIndex('paper.index');
$indexer->query('SELECT id,title,description,abstract,keywords FROM papers;');
$indexer->run();
}

таким образом, индекс всегда обновляется через контроллер.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]