laravel scout:如何在控制器中更新索引

时间:2018-01-20 22:26:16

标签: php laravel full-text-search artisan laravel-scout

这是我的问题。我想更新控制器中存储在存储中的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

这是我到目前为止所取得的成就: 虽然它会引发错误,但我只能在搜索结果中获得最后更新的行,并且最旧的行不会显示在搜索结果中。

那你有什么建议?这是一个更好的方法吗?或者我应该每天查看网站并运行工匠命令,以便可以将表编入索引?

1 个答案:

答案 0 :(得分:0)

我终于设法解决了这个问题:

更新存储中的索引,你只需从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();
    }

这样索引总是通过控制器更新。