make('blomstra.search.elastic_index'); /** @var array $seeders */ $seeders = $container->tagged('blomstra.search.seeders'); /** @var Queue $queue */ $queue = $container->make(Queue::class); /** @var Client $client */ $client = $container->make(Client::class); /** @var SettingsRepositoryInterface $settings */ $settings = $container->make(SettingsRepositoryInterface::class); $properties = [ 'properties' => [ 'content' => ['type' => 'text', 'analyzer' => 'flarum_analyzer'], 'created_at' => ['type' => 'date'], 'updated_at' => ['type' => 'date'], 'is_private' => ['type' => 'boolean'], 'is_sticky' => ['type' => 'boolean'], 'groups' => ['type' => 'integer'], 'recipient_groups' => ['type' => 'integer'], 'recipient_users' => ['type' => 'integer'], ] ]; if ($this->option('recreate')) { // Flush the index. $client->indices()->delete([ 'index' => $index, 'ignore_unavailable' => true ]); // Create a new index. $client->indices()->create([ 'index' => $index, 'body' => [ 'settings' => [ 'analysis' => [ 'analyzer' => [ 'flarum_analyzer' => [ 'type' => $settings->get('blomstra-search.analyzer-language') ?: 'english' ] ] ] ] ] ]); $client->indices()->putMapping([ 'index' => $index, 'body' => $properties ]); } $only = $this->option('only'); /** @var Seeder $seeder */ foreach ($seeders as $seeder) { if ($only && $seeder->type() !== $only) continue; $seeder->query() ->when($this->option('max-id'), function ($query, $id) { $query->where('id', '<=', $id); }) ->latest('created_at') ->chunk($this->option('chunk-size') ?? 1000, function (Collection $collection) use ($queue, &$total, $seeder) { $queue->pushOn(Job::$onQueue, new SavingJob($collection, $seeder)); $this->info("Pushed into the index, type: {$seeder->type()}, amount: {$collection->count()}."); $total += $collection->count(); }); $this->info("Pushed a total of $total into the index."); if ($throttle = $this->option('throttle')) { $this->info("Throttling for $throttle seconds"); sleep($throttle); } } } }