codewiser/laravel-scout

Laravel Scout 辅助工具

v1.0.8 2024-09-24 07:58 UTC

This package is auto-updated.

Last update: 2024-09-24 08:01:11 UTC


README

此包允许轻松支持并在应用程序之间切换少量 Scout 驱动器。

主要目标是管理复杂的自定义搜索。

这个简单的例子可以在任何 Scout 驱动器上工作。

$users = User::search('query')
    ->where('created_at', '>', now()->subYear())
    ->orderBy('created_at');

但如果我们需要更复杂的搜索,我们应该通过回调自定义搜索

$users = User::search('query', function () {
        // Customize search here
        // Function arguments differs depending on driver
    })
    ->orderBy('created_at');

比如说,我们想根据评论数量过滤用户。首先,我们需要重新配置可搜索的数据

use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;

class User extends Model {
    use Searchable;
    
    /**
     * Get the indexable data array for the model.
     *
     * @return array<string, mixed>
     */
    public function toSearchableArray()
    {
        $array = $this->toArray();
        
        // Customize the data array...
        if (config('scout.driver') == 'meilisearch') {
            $array['comments_count'] = $this->comments()->count();
        }
 
        return $array;
    }
}

注意!databasecollection 驱动器仅适用于自己的模型属性。如果您需要索引外键属性,您应该将它们隔离。

此包提供抽象类,该类为每个驱动器包含自定义搜索。实现 Codewiser\Scout\Concerns\ScoutsDatabaseCodewiser\Scout\Concerns\ScoutsMeilisearch\Codewiser\Scout\Concerns\ScoutsAlgolia — 根据您想使应用程序支持什么。

use Codewiser\Scout\Concerns\Scout;use Codewiser\Scout\Concerns\ScoutsDatabase;use Codewiser\Scout\Concerns\ScoutsMeilisearch;use Codewiser\Scout\Meilisearch\MeilisearchBuilder;use Illuminate\Database\Eloquent\Builder;

class UserScout extends Scout implements ScoutsDatabase, ScoutsMeilisearch
{
    public function __construct(public ?int $min_comments) {
        //
    }
    
    public function database(Builder $builder) : Builder
    {
        return $builder
            ->has('comments', '>=', $this->min_comments);
    }
    
    public function meilisearch(MeilisearchBuilder $builder) : MeilisearchBuilder
    {
        return $builder
            ->where('comments_count', '>=', $this->min_comments)
    }
}

如您所见,我们提供了具有熟悉界面的 MeilisearchBuilder,这对于构建 Meilisearch 过滤器很有帮助。

我们已准备好出发

public function index(\Illuminate\Http\Request $request)
{
    $scouter = new UserScout(min_comments: $request->input('filter.min_comments'));
    
    $users = User::search('query', $scouter)
        ->orderBy('created_at');
    
    // Debug search filters
    dump($scouter->debug());
    
    return $users->paginate();
}

Meilisearch 配置

默认情况下,我们应该在 config/scout.php 中配置 Meiliserach 索引设置:[https://laravel.net.cn/docs/10.x/scout#configuring-filterable-data-for-meilisearch](https://laravel.net.cn/docs/10.x/scout#configuring-filterable-data-for-meilisearch)

use App\Models\User;
use App\Models\Flight;
 
'meilisearch' => [
    'host' => env('MEILISEARCH_HOST', 'https://:7700'),
    'key' => env('MEILISEARCH_KEY', null),
    'index-settings' => [
        User::class => [
            'filterableAttributes'=> ['id', 'name', 'email'],
            'sortableAttributes' => ['created_at'],
            // Other settings fields...
        ],
        Flight::class => [
            'filterableAttributes'=> ['id', 'destination'],
            'sortableAttributes' => ['updated_at'],
        ],
    ],
],

此包允许使用 PHP 属性配置 Meilisearch。

class User extends \Illuminate\Database\Eloquent\Model
{
    use \Laravel\Scout\Searchable;
    
    #[MeilisearchFilterableAttributes(['id', 'name', 'email'])]
    #[MeilisearchSortableAttributes(['created_at'])]
    public function toSearchableArray()
    {
        //
    }
}

然后在 config/scout.php 中列出可搜索的类

use App\Models\User;
use App\Models\Flight;
 
'meilisearch' => [
    'host' => env('MEILISEARCH_HOST', 'https://:7700'),
    'key' => env('MEILISEARCH_KEY', null),
    'searchable' => [
        User::class
    ],
],

控制台

使用 scout:meilisearch-rebuild 命令完全重建 Meilisearch 索引。