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 コマンドを実行します。

セマンティック検索とハイブリッド検索(Meilisearch)

Meilisearchでセマンティック検索またはハイブリッド検索を使うには、インデックス設定でembedderを、モデル設定で埋め込み情報を指定します。
モデルの toSearchableEmbedding メソッドは、Laravel AI SDKで埋め込む元テキスト、または事前計算済みの埋め込み配列を返します。設定後は scout:sync-index-settings を実行してください。

Typesense

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

Turbopuffer

Turbopuffer はフルテキスト・セマンティック・ハイブリッド検索をサポートする検索エンジンです。Turbopufferドライバーを使うには、SCOUT_DRIVER とAPIキーを設定します。
TURBOPUFFER_REGION は省略可能で、デフォルトは gcp-us-central1 です。

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

外部サービスなしで検索を追加したい場合に最適なオプションです。 データベースエンジンはMySQL / PostgreSQLの全文インデックスと LIKE 句を使用します。ほとんどのアプリケーションでこれで十分です。

セマンティック検索とハイブリッド検索

データベースエンジンは、pgvector 拡張を有効にした PostgreSQL でセマンティック検索とハイブリッド検索をサポートします。モデルのテーブルに nullable なベクターカラムと全文インデックスを追加します。Scoutはモデル保存後に埋め込みを保存するため、ベクターカラムは nullable にしてください。
モデルに toSearchableEmbedding メソッドを定義します。このメソッドはScoutが埋め込む元テキスト、または事前計算済みの埋め込み配列を返します。保存先はデフォルトで embedding カラムですが、searchableEmbeddingColumn メソッドで変更できます。 コレクションエンジンはPHPでフィルタリングするため、SQLiteを含むLaravelがサポートするすべてのデータベースで動作します。ローカル開発・テスト・小規模データセット向けです。
データベースエンジンでは、外部エンジンとは異なりインデックスの手動管理は不要です。データベーステーブルを直接検索します。

Turbopufferの設定

Turbopufferでは、モデルごとに検索可能な属性とスキーマを config/scout.phpmodel-settings に定義します。
searchable-attributes の数値はBM25の相対的な重みです。例では、タイトルの一致が本文の3倍のスコアに寄与します。セマンティック検索を使う場合は embedding 設定とベクターのスキーマを追加し、モデルの toSearchableEmbedding メソッドから元テキストまたは埋め込み配列を返します。
Turbopufferのネイティブ埋め込みを使う場合は、Laravel AI SDKや toSearchableEmbedding は不要です。埋め込みの元属性を toSearchableArray の戻り値に含め、次のように設定します。

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 メソッドを使います。

セマンティック検索

埋め込みを設定した database、Meilisearch、Turbopuffer エンジンでは、クエリの意味に基づいてレコードを検索できます。検索クエリに semantic メソッドを追加します。
対応しているエンジンでは、最小類似度の閾値も指定できます。
全文検索とセマンティック検索を組み合わせるには hybrid メソッドを使います。引数でテキスト検索とセマンティック検索の相対的な重みを指定できます。

ページネーション

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年8月25日