1.elasticsearch/elasticsearch
php 连接elasticsearch客户端
安装命令 composer require elasticsearch/elasticsearch:* 安装兼容项目环境的elasticsearch扩展
2.laravel/scout
提供了一个基于驱动程序的解决方案来搜索你的模型
1.安装scout扩展
2.发布scout配置文件
3.在模型需要搜索的模型中use Searchable;
4.使用驱动前提条件
composer require laravel/scout:* php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider" 在scout.php 文件中,设置queue=>true(注意:algolia,meilisearch驱动即使你配置的是false也会自动开启,只针对queue有效)
5.配置模型索引(相当于mysql表)
6.配置模型id
7.为每个模型配置搜索引擎
8.数据库引擎(目前只支持Mysql, PostgreSql)
scout_drive = database
9.集合引擎
scout_drive = collection
注意:collection是最具可移植性的搜索引擎,因为它适用于 Laravel 支持的所有关系型数据库(包括 SQLite 和 SQL Server);然而,它的效率不如 Scout 的数据库引擎高
10.导入数据库的数据到搜索索引中
php artisan scout:import "App\Models\Post"
11.删除搜索索引中的数据
php artisan scout:flush "App\Models\Post"
12.添加索引记录 调用模型的save 或者 create方法自动添加搜索索引
一旦你为模型添加了 Laravel\Scout\Searchable
特性,你只需save或create一个模型实例,它将自动添加到你的搜索索引中。如果你已经配置了Scout来使用队列,这个操作将由你的队列工作者在后台执行
use App\Models\Order; $order = new Order; // ... $order->save();
13.通过查询添加索引记录
如果你想通过Eloquent查询向你的搜索索引中添加一组模型,你可以在Eloquent查询上链接 searchable
方法。searchable
方法将对查询结果进行分块处理,并将记录添加到你的搜索索引中。同样,如果你已经配置了Scout来使用队列,所有这些块都将由队列工作者在后台导入
use App\Models\Order; Order::where('price', '>', 100)->searchable();
14.删除索引中的记录
use App\Models\Order; $order = Order::find(1); $order->delete();
15.暂停索引
有时,你可能需要在模型上执行一批Eloquent操作,但不希望将模型数据同步到搜索索引中。你可以使用 withoutSyncingToSearch
方法来实现这一点。该方法接受一个闭包,该闭包将立即执行。在闭包中发生的任何模型操作都不会被同步到模型的索引中
use App\Models\Order; Order::withoutSyncingToSearch(function () { // Perform model actions... });
16.特定条件索引
有时候,你可能只希望在特定条件下使一个模型可搜索。例如,假设你有一个 App\Models\Post
模型,该模型可能处于 "draft"(草稿)和 "published"(已发布)两种状态之一。你可能只希望允许 "已发布" 的文章可搜索。为了实现这一点,你可以在你的模型上定义一个 shouldBeSearchable
方法
/** * Determine if the model should be searchable. */ public function shouldBeSearchable(): bool { return $this->isPublished(); }
shouldBeSearchable
方法仅在通过 save
和 create
方法、查询或关联操作模型时应用。直接使用 searchable
方法使模型或集合可搜索将覆盖 shouldBeSearchable
方法的结果
17.搜索
use App\Models\Order; $orders = Order::search('Star Trek')->get();
获取原始数据,而不是转化成Eloquent models $orders = Order::search('Star Trek')->raw();
18.自定义索引
通常,搜索查询将在由模型的 searchableAs
方法指定的索引上执行。然而,你可以使用 within
方法来指定应该搜索的自定义索引
$orders = Order::search('Star Trek') ->within('tv_shows_popularity_desc') ->get();
19.where
Scout允许你在搜索查询中添加简单的 "where" 子句。目前,这些子句仅支持基本的数值相等性检查,并主要用于通过所有者ID来限定搜索查询,支持whereIn
use App\Models\Order; $orders = Order::search('Star Trek')->where('user_id', 1)->get(); $orders = Order::search('Star Trek')->whereIn( 'status', ['paid', 'open'] )->get();
20.分页
$orders = Order::search('Star Trek')->paginate(15);
<div class="container"> @foreach ($orders as $order) {{ $order->price }} @endforeach </div> {{ $orders->links() }}
21.软删除
当这个配置选项为真时,Scout不会从搜索索引中移除软删除的模型。相反,它会在索引记录上设置一个隐藏的 __soft_deleted
属性。然后,你可以在搜索时使用 withTrashed
或 onlyTrashed
方法来检索软删除的记录
"soft_delete"=>true,
22.自定义引擎搜索
如果你需要对搜索引擎的搜索行为进行高级定制,你可以将闭包作为 search
方法的第二个参数传递。例如,你可以使用这个回调来在搜索查询传递给Algolia之前向搜索选项中添加地理位置数据
use Algolia\AlgoliaSearch\SearchIndex; use App\Models\Order; Order::search( 'Star Trek', function (SearchIndex $algolia, string $query, array $options) { $options['body']['query']['bool']['filter']['geo_distance'] = [ 'distance' => '1000km', 'location' => ['lat' => 36, 'lon' => 111], ]; return $algolia->search($query, $options); } )->get();
23.自定义查询结果集
在Scout从你的应用程序的搜索引擎检索到匹配的Eloquent模型列表之后,Eloquent被用于通过它们的主键检索所有匹配的模型。你可以通过调用 query
方法来自定义此查询。query
方法接受一个闭包作为参数,该闭包将接收Eloquent查询构建器实例作为参数
use App\Models\Order; use Illuminate\Database\Eloquent\Builder; $orders = Order::search('Star Trek') ->query(fn (Builder $query) => $query->with('invoices')) ->get();
24.自定义引擎
use Laravel\Scout\Builder; abstract public function update($models); abstract public function delete($models); abstract public function search(Builder $builder); abstract public function paginate(Builder $builder, $perPage, $page); abstract public function mapIds($results); abstract public function map(Builder $builder, $results, $model); abstract public function getTotalCount($results); abstract public function flush($model);
注册引擎
use App\ScoutExtensions\MySqlSearchEngine; use Laravel\Scout\EngineManager; /** * Bootstrap any application services. */ public function boot(): void { resolve(EngineManager::class)->extend('mysql', function () { return new MySqlSearchEngine; }); }
'driver' => 'mysql',
25.构建宏
"Builder Macros" 可以翻译为 "构建器宏" 或 "查询构建宏",在编程领域通常指的是对查询构建器(例如Eloquent查询构建器)进行扩展和自定义的方法或操作。这些宏允许开发者添加自定义的查询操作,以满足特定需求或简化查询语法。它们通常用于构建数据库查询、过滤数据或执行其他数据库操
use Illuminate\Support\Facades\Response; use Illuminate\Support\ServiceProvider; use Laravel\Scout\Builder; /** * Bootstrap any application services. */ public function boot(): void { Builder::macro('count', function () { return $this->engine()->getTotalCount( $this->engine()->search($this) ); }); }
use App\Models\Order; Order::search('Star Trek')->count();