Scout 전체 텍스트 검색
ㅋㅋ
- Queue
- 드라이버 요구 사항
- Algolia
- 구성
- 모델 인덱스 구성 모델 ID 구성
- Index쿼리를 통해 추가
- 사용자 정의 검색 엔진 매크로 명령 생성
Laravel Scout
Introduction
Laravel Scout는 Eloquent 모델의 전체 텍스트 검색을 위한 간단한 드라이버 기반 솔루션을 제공합니다. Scout는 모델 관찰자를 사용하여 Eloquent 레코드의 검색 색인을 자동으로 동기화합니다.
현재 Scout에는 Algolia 드라이버가 함께 제공됩니다. 그러나 사용자 정의 드라이버를 작성하는 것도 쉬우며 자체 검색 구현을 통해 Scout를 쉽게 확장할 수 있습니다.
Installation
먼저 Composer 패키지 관리자를 통해 Scout를 설치합니다.
composer require laravel/scout
Scout 설치가 완료된 후
vendor:publish
Artisan 명령을 사용하여 Scout 구성을 생성합니다. 파일. 이 명령은config
디렉토리에scout.php
구성 파일을 생성합니다.vendor:publish
Artisan 命令来生成 Scout 配置文件。这个命令将在你的config
目录下生成一个scout.php
配置文件。php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
最后,在你要做搜索的模型中添加
LaravelScoutSearchable
trait。这个 trait 会注册一个模型观察者来保持模型和所有驱动的同步:<?php namespace App; use Laravel\Scout\Searchable; use Illuminate\Database\Eloquent\Model; class Post extends Model{ use Searchable; }
队列
虽然并不强制使用 Scout,但是在使用这个库之前,强烈建议你配置一个 队列驱动,使用它运行一个队列来处理允许 Scout 将模型信息同步到搜索索引的所有操作,为你的应用的 web 接口提供更快的响应。
一旦你配置了队列驱动程序,你的
config/scout.php
配置文件中queue
选项的值要设置为true
'queue' => true,
마지막으로 검색하려는 모델에LaravelScoutSearchable
특성을 추가하세요. 이 특성은 모델과 모든 드라이버를 동기화 상태로 유지하기 위해 모델 관찰자를 등록합니다:composer require algolia/algoliasearch-client-php:^2.2
Scout를 반드시 사용해야 하는 것은 아니지만 이 라이브러리를 사용하기 전에 큐 드라이버를 구성하고 이를 사용하여 Scout가 모델 정보를 검색에 동기화할 수 있는 모든 작업을 처리하는 큐를 실행하는 것이 좋습니다. 애플리케이션의 웹 인터페이스에 대한 색인이 더 빠른 응답을 제공합니다. 🎜🎜큐 드라이버를 구성한 후에는queue
config/scout.php
구성 파일의queue
옵션 값을true
: 🎜<?php namespace App; use Laravel\Scout\Searchable; use Illuminate\Database\Eloquent\Model; class Post extends Model{ use Searchable; /** * 获取索引名称 * * @return string */ public function searchableAs() { return 'posts_index'; } }
🎜🎜🎜🎜🎜🎜드라이버 필수 조건
Algolia
Algolia 드라이버를 사용하는 경우
config/scout.php
id 및secret<을 구성해야 합니다. > 구성 파일/코드> 자격 증명. 자격 증명을 구성한 후에는 Composer 패키지 관리자를 사용하여 Algolia PHP SDK를 설치해야 합니다:
config/scout.php
配置文件配置你的 Algoliaid
和secret
凭证。配置好凭证之后,还需要使用 Composer 包管理器安装 Algolia PHP SDK:<?php namespace App; use Laravel\Scout\Searchable; use Illuminate\Database\Eloquent\Model; class Post extends Model{ use Searchable; /** * 获取模型的可搜索数据 * * @return array */ public function toSearchableArray() { $array = $this->toArray(); // Customize array... return $array; } }
配置
配置模型索引
每个 Eloquent 模型都是通过给定的 「索引」 进行同步,该 「索引」 包含所有可搜索的模型记录。换句话说,你可以把每一个 「索引」 设想为一张 MySQL 数据表。默认情况下,每个模型都会被持久化到与模型的 「表」 名(通常是模型名称的复数形式)相匹配的索引。你也可以通过重写模型上的
searchableAs
方法来自定义模型的索引:<?php namespace App; use Laravel\Scout\Searchable; use Illuminate\Database\Eloquent\Model; class User extends Model{ use Searchable; /** * 获取模型主键 * * @return mixed */ public function getScoutKey() { return $this->email; } }
配置可搜索数据
默认情况下,模型以完整的
toArray
格式持久化到搜索索引。如果要自定义同步到搜索索引的数据,可以覆盖模型上的toSearchableArray
方法:php artisan scout:import "App\Post"
配置模型 ID
默认情况下,Scout 将使用模型的主键作为搜索索引中存储的唯一 ID 。 可以通过模型上的
getScoutKey
方法自定义:php artisan scout:flush "App\Post"
索引
批量导入
如果你想安装 Scout 到已存在的项目中,你可能已经有了想要导入搜索驱动的数据库记录。Scout 提供了 Artisan 命令
import
用来导入所有已存在的记录到搜索索引:$order = new App\Order;// ...$order->save();
flush
命令可用于从搜索索引中删除所有模型的记录:// 通过 Eloquent 查询构造器增加.. App\Order::where('price', '>', 100)->searchable(); // 你也可以通过模型关系增加记录... $user->orders()->searchable(); // 你也可以通过集合增加记录... $orders->searchable();
添加记录
当你将
LaravelScoutSearchable trait
添加到模型中,你需要做的就是save
$order = App\Order::find(1); // 更新订单... $order->save();
구성
🎜🎜모델 인덱스 구성🎜🎜각 Eloquent 모델이 제공됩니다. 검색 가능한 모든 모델 기록이 포함된 "인덱스"를 동기화합니다. 즉, 각 "인덱스"를 MySQL 데이터 테이블로 생각할 수 있습니다. 기본적으로 각 모델은 모델의 "테이블" 이름(일반적으로 모델 이름의 복수형)과 일치하는 인덱스에 유지됩니다. 모델의searchableAs
메소드를 재정의하여 모델의 인덱스를 사용자 정의할 수도 있습니다. 🎜// 通过 Eloquent 查询更新... App\Order::where('price', '>', 100)->searchable(); // 你也可以通过数据间的关联进行更新... $user->orders()->searchable(); // 你也可以通过数据集合进行更新... $orders->searchable();
🎜🎜🎜🎜🎜검색 가능한 데이터 구성🎜🎜기본적으로 모델은 전체toArray
형식으로 검색 색인에 유지됩니다. 검색 색인에 동기화된 데이터를 사용자 정의하려면 모델에서toSearchableArray
메서드를 재정의할 수 있습니다. 🎜$order = App\Order::find(1); $order->delete();
🎜🎜🎜< div name=" 8c2464" data-unique="8c2464">🎜🎜모델 ID 구성🎜🎜기본적으로 Scout는 모델의 기본 키를 검색 색인에 저장된 고유 ID로 사용합니다. 모델의getScoutKey
메소드를 통해 사용자 정의할 수 있습니다: 🎜// 通过 Eloquent 查询删除... App\Order::where('price', '>', 100)->unsearchable(); // 你可以通过数据间的关系进行删除... $user->orders()->unsearchable(); // 你可以通过数据集合进行删除... $orders->unsearchable();
🎜🎜🎜🎜index
🎜🎜🎜🎜🎜Batch import🎜🎜기존 프로젝트에 Scout를 설치하려면, 검색 드라이버로 가져오려는 데이터베이스 레코드가 이미 있을 수 있습니다. Scout는 Artisan 명령어import
를 제공하여 기존의 모든 기록을 검색 색인으로 가져옵니다: 🎜App\Order::withoutSyncingToSearch(function () { // 执行模型操作... });
🎜flush
명령어는 검색 색인에서 모든 모델 기록을 삭제하는 데 사용할 수 있습니다: 🎜public function shouldBeSearchable(){ return $this->isPublished(); }
🎜🎜🎜🎜🎜Adding records🎜🎜LaravelScoutSearchable 특성
을 model 의 경우 모델 인스턴스를저장
하기만 하면 자동으로 검색 색인에 추가됩니다. 🎜큐를 사용🎜하도록 Scout를 구성한 경우 이 작업은 큐 작업자 프로세스에 의해 백그라운드에서 수행됩니다: 🎜// 此处将遵循 "shouldBeSearchable" 结果... App\Order::where('price', '>', 100)->searchable(); $user->orders()->searchable();$order->save(); // 此处将覆盖 "shouldBeSearchable" 结果... $orders->searchable(); $order->searchable();
🎜🎜쿼리를 통해 추가
Eloquent 쿼리 빌더를 통해 검색 인덱스에 모델 컬렉션을 추가하려는 경우 Eloquent 쿼리 빌더에서
searchable
메서드를 연결할 수도 있습니다.searchable
은 생성자의 쿼리 결과를 청크하고 검색 색인에 레코드를 추가합니다. 마찬가지로, 대기열을 사용하도록 Scout를 구성한 경우 모든 데이터 블록은 백그라운드에서 대기열 작업자 프로세스에 의해 추가됩니다.searchable
方法。searchable
会把构造器的查询 结果分块 并且将记录添加到你的搜索索引里。同样的,如果你已经配置 Scout 为使用队列,则所有的数据块将在后台由你的队列工作进程添加:$orders = App\Order::search('Star Trek')->get();
searchable
方法可以被看做是「更新插入」的操作。换句话说,如果模型记录已经在你的索引里了,它就会被更新。如果搜索索引中不存在,则将其添加到索引中。更新记录
要更新可搜索的模型,只需要更新模型实例的属性并将模型
save
到数据库。Scout 会自动将更新同步到你的搜索索引中:use Illuminate\Http\Request; Route::get('/search', function (Request $request) { return App\Order::search($request->search)->get(); });
你也可以在 Eloquent 查询语句上使用
searchable
方法来更新一个模型的集合。如果这个模型不存在你检索的索引里,就会被创建:$orders = App\Order::search('Star Trek')->raw();
删除记录
使用
delete
从数据库中删除该模型就可以移除索引里的记录。这种删除形式甚至与 软删除 的模型兼容:$orders = App\Order::search('Star Trek') ->within('tv_shows_popularity_desc') ->get();
如果你不希望记录在删除之前被检索到,可以在 Eloquent 查询实例或集合上使用
unsearchable
方法:$orders = App\Order::search('Star Trek')->where('user_id', 1)->get();
暂停索引
你可能需要在执行一批 Eloquent 操作的时候,不同步模型数据到搜索索引。此时你可以使用
withoutSyncingToSearch
方法来执行此操作。这个方法接受一个立即执行的回调。该回调中所有的操作都不会同步到模型的索引:$orders = App\Order::search('Star Trek')->paginate();
有条件的搜索模型实例
有时候你可能需要在某些条件下模型是可搜索的。例如,假设你有
AppPost
模型可能两种状态之一:「草稿」和「发布」。你可能只允许搜索 「发布」过的帖子。为了实现这一点,你需要在模型中定义一个shouldBeSearchable
方法:$orders = App\Order::search('Star Trek')->paginate(15);
只有在通过
save
方法、查询或关联模型操作时,才应使用shouldBeSearchable
方法。直接使用searchable
方法将使模型或集合的可搜索结果覆盖shouldBeSearchable
<div class="container"> @foreach ($orders as $order) {{ $order->price }} @endforeach </div> {{ $orders->links() }}
searchable
메서드는 "업데이트 삽입" 작업으로 간주될 수 있습니다. 즉, 모델 레코드가 이미 색인에 있으면 업데이트됩니다. 검색 색인에 없으면 색인에 추가됩니다.검색 가능한 모델을 업데이트하려면 다음의 속성을 업데이트하세요. 모델 인스턴스를 생성하고 모델을 데이터베이스에기록 업데이트 중
저장
합니다. Scout는 업데이트를 검색 색인에 자동으로 동기화합니다: 🎜'soft_delete' => true,
🎜 또한 Eloquent 쿼리에서searchable
메소드를 사용하여 모델 컬렉션을 업데이트할 수도 있습니다. 검색 중인 인덱스에 모델이 없으면 생성됩니다: 🎜// 搜索结果包括已删除的记录... $orders = App\Order::withTrashed()->search('Star Trek')->get(); // 搜索结果只含已删除的记录... $orders = App\Order::onlyTrashed()->search('Star Trek')->get();
🎜🎜🎜🎜레코드 삭제
🎜delete
를 사용하여 데이터베이스에서 모델을 삭제하여 인덱스의 레코드를 제거하세요. 이러한 형태의 삭제는 일시 삭제 모델과도 호환됩니다: 🎜use Algolia\AlgoliaSearch\SearchIndex; App\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();
🎜 삭제 전에 레코드를 검색하지 않으려면 Eloquent 쿼리 인스턴스 또는 컬렉션에서unsearchable
메소드를 사용할 수 있습니다 : 🎜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($results, $model); abstract public function getTotalCount($results); abstract public function flush($model);
🎜< a name="pausing-indexing">🎜🎜🎜색인 생성 일시중지
🎜일괄 작업을 수행해야 할 수도 있습니다. 모델 데이터를 검색 인덱스에 동기화하지 않고 Eloquent 작업을 수행합니다. 이 시점에서withoutSyncingToSearch
메소드를 사용하여 이를 수행할 수 있습니다. 이 메서드는 즉시 실행되는 콜백을 허용합니다. 이 콜백의 모든 작업은 모델 인덱스와 동기화되지 않습니다: 🎜use Laravel\Scout\EngineManager; /** * 启动任何的服务 * * @return void */ public function boot(){ resolve(EngineManager::class)->extend('mysql', function () { return new MySqlSearchEngine; }); }
🎜🎜🎜🎜 < h3>조건부 검색 모델 인스턴스🎜때때로 특정 조건에서 검색할 수 있는 모델이 필요할 수 있습니다. 예를 들어, "초안" 또는 "게시됨"이라는 두 가지 상태 중 하나일 수 있는AppPost
모델이 있다고 가정해 보겠습니다. "게시된" 게시물에 대해서만 검색을 허용할 수 있습니다. 이를 달성하려면 모델에서shouldBeSearchable
메서드를 정의해야 합니다. 🎜'driver' => 'mysql',
🎜save
메서드, 쿼리 또는 관련 모델을 통해 작동할 때만 사용해야 합니다. >shouldBeSearchable 메소드.searchable
메서드를 직접 사용하면 모델이나 컬렉션의 검색 가능한 결과가shouldBeSearchable
메서드의 결과를 재정의하게 됩니다. 🎜<?php namespace App\Providers; use Laravel\Scout\Builder; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Response; class ScoutMacroServiceProvider extends ServiceProvider{ /** * 注册应用的Scout 宏命令. * * @return void */ public function boot() { Builder::macro('count', function () { return $this->engine->getTotalCount( $this->engine()->search($this) ); }); } }
🎜🎜🎜🎜🎜🎜Search
search
방법을 사용하여 모델을 검색할 수 있습니다. 검색 방법은 모델을 검색하기 위해 문자열을 허용합니다. 또한 주어진 검색 문과 일치하는 Eloquent 모델을 쿼리하려면 검색 쿼리에get
메서드를 연결해야 합니다.search
方法来搜索模型。search 方法接受一个用于搜索模型的字符串。你还需要在搜索查询上链式调用get
方法,才能用给定的搜索语句查询与之匹配的 Eloquent 模型:App\Order::search('Star Trek')->count();
Scout 搜索返回 Eloquent 模型的集合,因此你可以直接从路由或控制器返回结果,它们会被自动转换成 JSON 格式:
rrreee如果你想在它们返回 Eloquent 模型前得到原结果,你应该使用
rrreeeraw
方法:搜索查询通常会在模型的
rrreeesearchableAs
方法指定的索引上执行。当然,你也可以使用within
方法指定应该搜索的自定义索引:Where 语句
允许你在搜索查询中增加简单的 "where" 语句。目前,这些语句只支持基本的数值等式检查,并且主要是用于根据租户 ID 进行的范围搜索查询。由于搜索索引不是关系型数据库,因此当前不支持更高级的 "where" 语句:
rrreee分页
除了检索模型的集合,你也可以使用
rrreeepaginate
方法对搜索结果进行分页。这个方法会返回一个就像 传统的 Eloquent 查询分页 一样的Paginator
实例:你可以通过将数量作为第一个参数传递给
rrreeepaginate
方法来指定每页检索多少个模型:获取到检索结果后,就可以使用 Blade 来渲染分页链接和显示检索结果,就像传统的 Eloquent 查询分页一样:
rrreee软删除
如果你的索引模型是 软删除 ,并且你需要搜索软删除的模型,设置
rrreeeconfig/scout.php
配置文件的soft_delete
选项的值为true
:当这个配置选项是
rrreeetrue
的时候, Scout 不会从搜索索引中移除软删除模型。相反,它会在索引记录中设置一个隐藏__soft_deleted
属性。 然后,在搜索的时候,你可以使用withTrashed
或onlyTrashed
方法检索软删除记录:
rrreee{提示} 要永久删除模型可以使用
Scout 검색은 Eloquent 모델 컬렉션을 반환하므로 결과가 다음과 같을 때 직접 수행할 수 있습니다. 경로나 컨트롤러에서 반환되면 자동으로 JSON 형식으로 변환됩니다:forceDelete
rrreeeEloquent 모델로 반환되기 전에 원래 결과를 얻으려면
메서드에 의해 지정된 인덱스에서 실행됩니다. 물론raw
메서드를 사용해야 합니다: rrreee검색 쿼리는 일반적으로 모델의searchableAs
within
메소드를 사용하여 검색해야 하는 사용자 정의 색인을 지정할 수도 있습니다:rrreee🎜🎜🎜Where 문
🎜을 사용하면 검색어에 간단한 "where" 문을 추가할 수 있습니다. 현재 이러한 문은 기본적인 숫자 동일성 검사만 지원하며 주로 테넌트 ID를 기반으로 하는 범위 검색 쿼리에 사용됩니다. 검색 색인은 관계형 데이터베이스가 아니기 때문에 현재 고급 "where" 문은 지원되지 않습니다. 🎜rrreee🎜🎜🎜🎜< h3>페이지 매기기🎜모델 컬렉션을 검색하는 것 외에도페이지 매기기
메소드를 사용하여 검색 결과에 페이지 매기기를 수행할 수도 있습니다. 이 메소드는 기존 Eloquent 쿼리 페이지 매김과 마찬가지로Paginator
인스턴스를 반환합니다. 🎜rrreee🎜 수량을paginate
메소드의 첫 번째 인수로 전달하여 지정할 수 있습니다. 페이지당 검색: 🎜rrreee🎜검색 결과를 얻은 후 전통적인 Eloquent 쿼리 페이징과 마찬가지로 블레이드를 사용하여 페이징 링크를 렌더링하고 검색 결과를 표시할 수 있습니다. 🎜rrreee🎜🎜🎜🎜소프트 삭제
🎜인덱스 모델이 소프트 삭제되어 소프트 삭제된 모델을 검색해야 하는 경우config/scout.php를 설정하세요.
구성 파일의soft_delete
옵션 값은true
입니다. 🎜rrreee🎜이 구성 옵션이true
이면 Scout는 검색 색인에서 일시 삭제된 모델을 제거합니다. 대신, 인덱스 레코드에 숨겨진__soft_deleted
속성을 설정합니다. 그런 다음 검색할 때withTrashed
또는onlyTrashed
메소드를 사용하여 일시 삭제된 레코드를 검색할 수 있습니다. 🎜rrreee🎜{Tip} 모델을 영구적으로 삭제하려면 < code >forceDelete를 삭제하면 Scout가 자동으로 검색 색인에서 모델을 제거합니다. 🎜🎜🎜🎜🎜🎜🎜🎜
맞춤형 검색 엔진
엔진의 검색 동작을 맞춤설정해야 하는 경우 콜백을
rrreeesearch
메소드의 두 번째 매개변수로 전달할 수 있습니다. 예를 들어, 이 콜백을 사용하면 Algolia에 지리 위치 데이터를 전달하기 전에 검색 요청에 위치 정보 데이터를 추가할 수 있습니다.search
方法。例如,在将搜索查询传递给 Algolia 之前,可以使用这个回调将地理位置数据添加到搜索请求中:自定义引擎
写引擎
如果内置的 Scout 搜索引擎不能满足你的需求,你可以编写自定义的引擎并且将它注册到 Scout。你的引擎需要继承
rrreeeLaravelScoutEnginesEngine
抽象类,这个抽象类包含了你自定义的引擎必须要实现的七个方法:在
LaravelScoutEnginesAlgoliaEngine
类里查看这些方法的实现会对你有较大的帮助。这个类会为你在学习如何在自定义引擎中实现这些方法提供一个好的起点。注册引擎
一旦你写好了自定义引擎,你可以用 Scout 引擎管理的
rrreeeextend
方法将它注册到 Scout。你只需要从AppServiceProvider
下的boot
方法或者应用中使用的任何一个服务提供器中调用extend
方法。举个例子,如果你写好了一个MySqlSearchEngine
,你可以像这样去注册它:引擎注册后,你可以在
rrreeeconfig/scout.php
配置文件中指定它为默认的 Scoutdriver
:生成宏命令
如果你想要自定义生成器方法,你可以使用
rrreeeLaravelScoutBuilder
类下的macro
方法。通常,定义 "macros" 时, 需要实现 service provider'sboot
方法:macro
函数接受一个名字作为第一个参数,第二个参数为一个闭包函数。当
调用LaravelScoutBuilder
rrreee내장 Scout 검색 엔진이 만족하지 못하는 경우 필요에 따라 사용자 정의 엔진을 작성하고 이를 Scout에 등록할 수 있습니다. 귀하의 엔진은커스텀 엔진
쓰기 엔진
LaravelScoutEnginesEngine
추상 클래스를 상속해야 합니다. 이 추상 클래스에는 사용자 정의 엔진이 구현해야 하는 7가지 메소드가 포함되어 있습니다: 🎜rrreee🎜LaravelScoutEnginesAlgoliaEngine
클래스에서 이를 확인하세요. 방법이 당신에게 큰 도움이 될 것입니다. 이 수업은 사용자 정의 엔진에서 이러한 메소드를 구현하는 방법을 배우기 위한 좋은 출발점을 제공합니다. 🎜🎜엔진 등록
🎜사용자 정의 엔진을 작성한 후에는 Scout 엔진을 사용하여확장
Scout에 등록하는 방법입니다.AppServiceProvider
또는 애플리케이션에 사용되는 서비스 공급자 아래의boot
메서드에서extend
메서드를 호출하기만 하면 됩니다. 예를 들어MySqlSearchEngine
을 작성한 경우 다음과 같이 등록할 수 있습니다. 🎜rrreee🎜엔진이 등록된 후config/scout.php
에서 구성할 수 있습니다. 파일에서 이를 기본 Scout드라이버
로 지정합니다: 🎜rrreee🎜🎜🎜🎜< h2 >매크로 명령 생성🎜생성기 메소드를 사용자 정의하려면LaravelScoutBuilder
클래스 아래의macro
메소드를 사용할 수 있습니다. 일반적으로 "매크로"를 정의할 때 서비스 공급자의boot
메서드를 구현해야 합니다. 🎜rrreee🎜macro
이 함수는 이름을 첫 번째 매개변수로 받아들이고 두 번째 매개변수는 클로저 패키지 기능입니다. 이 함수는LaravelScoutBuilder
매크로 명령을 호출할 때 호출됩니다.🎜rrreee🎜이 글은 🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜