Laravel Elasticsearch 集成

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 方法仅在通过 savecreate 方法、查询或关联操作模型时应用。直接使用 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 属性。然后,你可以在搜索时使用 withTrashedonlyTrashed 方法来检索软删除的记录

 

"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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值