[英]laravel scout: How to update index in controller
这是我的问题。 我想更新控制器中存储在存储中的scout索引。 有什么想法怎么做?
我正在使用tntsearch包。 我知道我可以在命令提示符下使用$ php artisan scout:import App\\\\Models\\\\Paper
来做artisan命令$ 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类创建一个新的obj; 首先,创建该索引,然后使用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();
}
这样,索引总是通过控制器更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.