laravel scout: 如何在控制器中更新索引
laravel scout: How to update index in controller
这是我的问题。我想更新保存在控制器存储中的 scout 索引。有什么想法吗?
我正在使用 tntsearch 包。我知道我可以在命令提示符下使用 $ php artisan scout:import App\Models\Paper
执行 artisan 命令
但我正在开发一个网站,每个人都可以在其中提交他们的期刊,我的网站需要一个强大的搜索引擎。所以在这种情况下,我需要在每次提交期刊时更新索引。方便大家检索期刊。
我设法通过创建提供程序来完成此任务的一部分 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
这是我到目前为止完成的工作:
虽然它会抛出错误,但我只能在搜索结果中获取最后更新的行,而最旧的行不会显示在搜索结果中。
那么你有什么建议呢?这是更好的方法吗?或者我应该每天检查站点并 运行 artisan 命令以便 table 可以被索引?
我终于解决了这个问题:
要更新存储中的索引,您只需从 TNTindexer 创建一个新对象 class;首先,您创建该索引,然后,您 select 您想要使用 query() 方法更新的列。然后 运行() indexer.Before 确保加载配置。这是我在控制器中编写的方法:
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();
}
这样索引总是通过控制器更新。
这是我的问题。我想更新保存在控制器存储中的 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
这是我到目前为止完成的工作: 虽然它会抛出错误,但我只能在搜索结果中获取最后更新的行,而最旧的行不会显示在搜索结果中。
那么你有什么建议呢?这是更好的方法吗?或者我应该每天检查站点并 运行 artisan 命令以便 table 可以被索引?
我终于解决了这个问题:
要更新存储中的索引,您只需从 TNTindexer 创建一个新对象 class;首先,您创建该索引,然后,您 select 您想要使用 query() 方法更新的列。然后 运行() indexer.Before 确保加载配置。这是我在控制器中编写的方法:
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();
}
这样索引总是通过控制器更新。