Skip to main content

はじめに

Laravel Scout は、Eloquentモデルに全文検索機能を追加するための、シンプルなドライバーベースのソリューションです。モデルオブザーバーを使用して、Eloquentレコードと検索インデックスを自動的に同期します。 Scout には、MySQL / PostgreSQL の全文インデックスと LIKE 句を使ってデータベースを直接検索する組み込みの database エンジンが含まれており、外部サービスは不要です。大規模なプロダクション環境で、タイポ許容・ファセット検索・ジオサーチが必要な場合は、外部エンジンが役立ちます。

対応エンジン一覧

インストール

Composerでパッケージをインストールします。
インストール後、vendor:publish コマンドで設定ファイルを公開します。config/scout.php が生成されます。
最後に、検索可能にしたいモデルに Laravel\Scout\Searchable トレイトを追加します。このトレイトがモデルオブザーバーを登録し、検索ドライバーとの自動同期を有効にします。

キューの設定

database または collection エンジン以外を使用する場合、Scoutを使用する前にキュードライバーの設定を強く推奨します。キューワーカーを動かすことで、インデックス同期操作がバックグラウンドで実行され、Webインターフェースの応答速度が大幅に向上します。 config/scout.phpqueue オプションを true に設定します。
接続名とキュー名を指定することもできます。
設定後、専用のキューワーカーを起動します。

ユニークなジョブの使用

書き込みの多いアプリケーションでは、同じモデルレコードに対する重複したキュージョブがキューに登録されるのを防ぎたい場合があります。config/scout.phpMakeSearchableUniquelyRemoveFromSearchUniquely ジョブクラスを登録することで、ユニークなインデックスジョブを使用できます。通常、これはサービスプロバイダーの boot メソッドで設定します。
これらのジョブは Laravel のユニークなジョブロックを使用して、既にキューに登録されている同じモデルレコードの重複したインデックス操作をディスパッチするのを防ぎます。

ドライバーの前提条件

Algolia

Algoliaドライバーを使用する場合は、config/scout.phpidsecret の認証情報を設定し、Algolia PHP SDKをインストールします。
.env ファイルに認証情報を追加します。

インデックス設定

Algoliaでは config/scout.php でインデックス設定を管理できます。
設定後、scout:sync-index-settings コマンドを実行してAlgoliaに設定を反映させます。

Meilisearch

Meilisearch は高速なオープンソース検索エンジンです。ローカル開発では Laravel Sail のDockerを使うのが最も簡単です。
Sailを使わない場合は、Dockerで直接起動できます。
Meilisearch PHP SDKをインストールします。
.env ファイルにドライバーとホストを設定します。
Scoutをアップグレードする際は、Meilisearchサービス自体の破壊的変更も必ず確認してください。

インデックス設定(Meilisearch)

Meilisearchでは where() でフィルタリングするカラムを filterableAttributes に、orderBy() でソートするカラムを sortableAttributes に事前登録する必要があります。
数値カラムのデータ型に注意が必要です。Meilisearchは正しい型のデータにのみフィルター操作(>< など)を実行できます。
設定後、scout:sync-index-settings コマンドを実行します。

Typesense

Typesense は高速なオープンソース検索エンジンで、キーワード検索・セマンティック検索・ジオ検索・ベクトル検索に対応しています。
.env ファイルに接続情報を設定します。
Typesenseを使用する場合、toSearchableArray メソッドでモデルの主キーを文字列に、作成日時をUNIXタイムスタンプにキャストする必要があります。

データベース / コレクションエンジン

外部サービスなしで検索を追加したい場合に最適なオプションです。 データベースエンジンはMySQL / PostgreSQLの全文インデックスと LIKE 句を使用します。ほとんどのアプリケーションでこれで十分です。
コレクションエンジンはPHPでフィルタリングするため、SQLiteを含むLaravelがサポートするすべてのデータベースで動作します。ローカル開発・テスト・小規模データセット向けです。
データベースエンジンでは、外部エンジンとは異なりインデックスの手動管理は不要です。データベーステーブルを直接検索します。

Searchable トレイト

toSearchableArray() のカスタマイズ

デフォルトでは、モデルの toArray() の全データが検索インデックスに保存されます。インデックスに同期するデータをカスタマイズするには、toSearchableArray メソッドをオーバーライドします。

インデックス名のカスタマイズ

デフォルトでは、モデルのテーブル名(複数形)がインデックス名として使用されます。searchableAs メソッドをオーバーライドしてカスタマイズできます。

データベースエンジン用の検索戦略

データベースエンジンでは、カラムごとに効率的な検索戦略をPHP属性で指定できます。
SearchUsingFullText を使用する前に、対象カラムに全文インデックスが付与されていることを確認してください。

条件付きで検索可能にする

特定の条件下でのみモデルを検索可能にしたい場合は、shouldBeSearchable メソッドを定義します。
shouldBeSearchable はデータベースエンジンでは機能しません。データベースエンジンで同様の動作を実現するには、where句を使用してください。

インデックスの管理

このセクションのコマンドは、主にAlgolia・Meilisearch・Typesenseなどのサードパーティエンジンを使用する場合に関係します。データベースエンジンではインデックス管理は不要です。

既存レコードのインポート

既存プロジェクトにScoutを導入する場合、scout:import コマンドで既存レコードをインデックスにインポートします。
キューを使ってバックグラウンドでインポートすることもできます。

インデックスのクリア

モデルのすべてのレコードを検索インデックスから削除するには scout:flush を使います。

インデックスの一時停止

Eloquent操作中に検索インデックスとの同期を一時的に止めたい場合は withoutSyncingToSearch を使います。

レコードの手動追加・削除

クエリを使ってモデルのコレクションをインデックスに追加できます。
インデックスからレコードを削除するには unsearchable を使います。
モデルを delete すると、インデックスからも自動的に削除されます。

検索

search メソッドでモデルを検索します。get を連結してEloquentモデルのコレクションを取得します。
コントローラーやルートから直接返すとJSONに自動変換されます。
生の検索結果が必要な場合は raw メソッドを使います。

ページネーション

paginate メソッドで検索結果をページネーションできます。通常のEloquentクエリのページネーションと同様に機能します。
データベースエンジンでは simplePaginate も使用できます。総件数を取得しないため大規模データセットで効率的です。
Bladeテンプレートでの表示例:

フィルタリングとソート

where メソッドで検索クエリにフィルター条件を追加できます。
Meilisearchを使用する場合、where を使う前にフィルタリング可能な属性を設定する必要があります。
query メソッドでEloquentクエリをカスタマイズすることもできます。

Eager Loading

Scout を使用すると、検索エンジンからIDの一覧を取得した後、Eloquentでモデルを取得します。N+1問題を避けるには、query メソッドで with() を使ったEager Loadingを指定します。
バッチインポート時にリレーションをEager Loadするには、makeAllSearchableUsing メソッドを定義します。
makeAllSearchableUsing はキューを使ったバッチインポートでは使用できない場合があります。キュージョブでモデルコレクションが処理されるときにリレーションは復元されません。

ソフトデリート

インデックスされたモデルがソフトデリートを使用していて、削除済みモデルも検索したい場合は、config/scout.phpsoft_delete オプションを true に設定します。
有効にすると、withTrashedonlyTrashed で削除済みレコードを検索できます。

カスタムエンジン

組み込みの検索エンジンがニーズに合わない場合は、独自のカスタムエンジンを実装できます。カスタムエンジンは Laravel\Scout\Engines\Engine 抽象クラスを継承し、以下の8つのメソッドを実装する必要があります。
実装の参考として、Laravel\Scout\Engines\AlgoliaEngine クラスを確認してください。 作成したカスタムエンジンは、App\Providers\AppServiceProviderboot メソッドでScoutに登録します。
登録後、config/scout.php でドライバーとして指定します。

関連ページ

Eloquent ORM

Eloquentモデルの基本的な使い方を確認します。

Eloquentリレーション

リレーションの定義とEager Loadingを確認します。

キュー

Scoutはキューとあわせてインデックスをバックグラウンドで更新できます。
最終更新日 2026年7月20日