Вот мой вопрос Я хочу обновить индекс разведчика, сохраненный в хранилище моего контроллера. Есть идеи как это сделать?
я использую 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
Вот что я делаю до сих пор:
хотя и выдает ошибку, но я могу получить только последнюю обновленную строку в результатах поиска, а самые старые строки не отображаются в результатах поиска.
Итак, каковы ваши предложения? Это лучший способ сделать это? Или я должен проверять сайт каждый день и запускать команды ремесленников, чтобы таблица могла быть проиндексирована?
Мне наконец-то удалось решить эту проблему:
для обновления индекса в хранилище вы просто создаете новый объект из класса 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();
}
таким образом, индекс всегда обновляется через контроллер.
Других решений пока нет …