はじめに
Laravel Scout は、Eloquentモデルに全文検索機能を追加するための、シンプルなドライバーベースのソリューションです。モデルオブザーバーを使用して、Eloquentレコードと検索インデックスを自動的に同期します。 Scout には、MySQL / PostgreSQL の全文インデックスとLIKE 句を使ってデータベースを直接検索する組み込みの database エンジンが含まれており、外部サービスは不要です。大規模なプロダクション環境で、タイポ許容・ファセット検索・ジオサーチが必要な場合は、外部エンジンが役立ちます。
対応エンジン一覧
インストール
Composerでパッケージをインストールします。vendor:publish コマンドで設定ファイルを公開します。config/scout.php が生成されます。
Laravel\Scout\Searchable トレイトを追加します。このトレイトがモデルオブザーバーを登録し、検索ドライバーとの自動同期を有効にします。
キューの設定
database または collection エンジン以外を使用する場合、Scoutを使用する前にキュードライバーの設定を強く推奨します。キューワーカーを動かすことで、インデックス同期操作がバックグラウンドで実行され、Webインターフェースの応答速度が大幅に向上します。
config/scout.php の queue オプションを true に設定します。
ユニークなジョブの使用
書き込みの多いアプリケーションでは、同じモデルレコードに対する重複したキュージョブがキューに登録されるのを防ぎたい場合があります。config/scout.php で MakeSearchableUniquely と RemoveFromSearchUniquely ジョブクラスを登録することで、ユニークなインデックスジョブを使用できます。通常、これはサービスプロバイダーの boot メソッドで設定します。
ドライバーの前提条件
Algolia
Algoliaドライバーを使用する場合は、config/scout.php に id と secret の認証情報を設定し、Algolia PHP SDKをインストールします。
.env ファイルに認証情報を追加します。
インデックス設定
Algoliaではconfig/scout.php でインデックス設定を管理できます。
scout:sync-index-settings コマンドを実行してAlgoliaに設定を反映させます。
Meilisearch
Meilisearch は高速なオープンソース検索エンジンです。ローカル開発では Laravel Sail のDockerを使うのが最も簡単です。.env ファイルにドライバーとホストを設定します。
インデックス設定(Meilisearch)
Meilisearchではwhere() でフィルタリングするカラムを filterableAttributes に、orderBy() でソートするカラムを sortableAttributes に事前登録する必要があります。
>、< など)を実行できます。
scout:sync-index-settings コマンドを実行します。
Typesense
Typesense は高速なオープンソース検索エンジンで、キーワード検索・セマンティック検索・ジオ検索・ベクトル検索に対応しています。.env ファイルに接続情報を設定します。
toSearchableArray メソッドでモデルの主キーを文字列に、作成日時をUNIXタイムスタンプにキャストする必要があります。
データベース / コレクションエンジン
外部サービスなしで検索を追加したい場合に最適なオプションです。 データベースエンジンはMySQL / PostgreSQLの全文インデックスとLIKE 句を使用します。ほとんどのアプリケーションでこれで十分です。
データベースエンジンでは、外部エンジンとは異なりインデックスの手動管理は不要です。データベーステーブルを直接検索します。
Searchable トレイト
toSearchableArray() のカスタマイズ
デフォルトでは、モデルのtoArray() の全データが検索インデックスに保存されます。インデックスに同期するデータをカスタマイズするには、toSearchableArray メソッドをオーバーライドします。
インデックス名のカスタマイズ
デフォルトでは、モデルのテーブル名(複数形)がインデックス名として使用されます。searchableAs メソッドをオーバーライドしてカスタマイズできます。
データベースエンジン用の検索戦略
データベースエンジンでは、カラムごとに効率的な検索戦略をPHP属性で指定できます。条件付きで検索可能にする
特定の条件下でのみモデルを検索可能にしたい場合は、shouldBeSearchable メソッドを定義します。
インデックスの管理
このセクションのコマンドは、主にAlgolia・Meilisearch・Typesenseなどのサードパーティエンジンを使用する場合に関係します。データベースエンジンではインデックス管理は不要です。
既存レコードのインポート
既存プロジェクトにScoutを導入する場合、scout:import コマンドで既存レコードをインデックスにインポートします。
インデックスのクリア
モデルのすべてのレコードを検索インデックスから削除するにはscout:flush を使います。
インデックスの一時停止
Eloquent操作中に検索インデックスとの同期を一時的に止めたい場合はwithoutSyncingToSearch を使います。
レコードの手動追加・削除
クエリを使ってモデルのコレクションをインデックスに追加できます。unsearchable を使います。
delete すると、インデックスからも自動的に削除されます。
検索
search メソッドでモデルを検索します。get を連結してEloquentモデルのコレクションを取得します。
raw メソッドを使います。
ページネーション
paginate メソッドで検索結果をページネーションできます。通常のEloquentクエリのページネーションと同様に機能します。
simplePaginate も使用できます。総件数を取得しないため大規模データセットで効率的です。
フィルタリングとソート
where メソッドで検索クエリにフィルター条件を追加できます。
query メソッドでEloquentクエリをカスタマイズすることもできます。
Eager Loading
Scout を使用すると、検索エンジンからIDの一覧を取得した後、Eloquentでモデルを取得します。N+1問題を避けるには、query メソッドで with() を使ったEager Loadingを指定します。
makeAllSearchableUsing メソッドを定義します。
ソフトデリート
インデックスされたモデルがソフトデリートを使用していて、削除済みモデルも検索したい場合は、config/scout.php の soft_delete オプションを true に設定します。
withTrashed や onlyTrashed で削除済みレコードを検索できます。
カスタムエンジン
組み込みの検索エンジンがニーズに合わない場合は、独自のカスタムエンジンを実装できます。カスタムエンジンはLaravel\Scout\Engines\Engine 抽象クラスを継承し、以下の8つのメソッドを実装する必要があります。
Laravel\Scout\Engines\AlgoliaEngine クラスを確認してください。
作成したカスタムエンジンは、App\Providers\AppServiceProvider の boot メソッドでScoutに登録します。
config/scout.php でドライバーとして指定します。
関連ページ
Eloquent ORM
Eloquentモデルの基本的な使い方を確認します。
Eloquentリレーション
リレーションの定義とEager Loadingを確認します。
キュー
Scoutはキューとあわせてインデックスをバックグラウンドで更新できます。