本記事は2ページにわたって解説しています。
はじめに
今回は、Laravel Scoutを使う方法をまとめました。
全文検索を実装するためのドライバが用意されています。
検索エンジンはLaravel Sailに標準で導入されている、Meilisearchを使用します。
日本語の検索に対応していますので試してみましょう。
Laravel Scoutを使用して実装を行うことにより、エンジンが違っても基本的には同じコーディングを行うことができます。
それでは、全文検索を実装してみましょう。
他にも私のブログで、Laravelについて解説している記事がありますのでご覧ください。
【紹介】個人開発
私の個人開発ですがQuiphaというサービスを開発しました。(Laravel, Vue3など)
良かったら、会員登録して動作を試してみて下さい。
また、Laravel 9 実践入門という書籍を出版しました。
Kindle Unlimitedを契約している方であれば、読み放題で無料でご覧いただくことができます。
開発環境の準備
今回は、Laravel Sailを使って環境の構築を行いました。
以下の記事を参考にしてください。
phpMyAdminのインストール
phpMyAdminをインストールすることができます。
以下の記事をご覧ください。
VS Codeの用意
VS Codeのインストール方法は、以下の記事にまとめましたのでご覧ください。
設定方法は以下を参考にしてください。
Meilisearchの確認
まずは、docker-compose.ymlを確認しましょう。
Meilisearchが定義されています。
meilisearch:
image: 'getmeili/meilisearch:latest'
ports:
- '${FORWARD_MEILISEARCH_PORT:-7700}:7700'
volumes:
- 'sail-meilisearch:/meili_data'
networks:
- sail
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--spider", "http://localhost:7700/health"]
retries: 3
timeout: 5s
Sailで構築した場合は、初期状態で使用できる状態になっています。
Sailを起動します。
$ sail up -d
Meilisearchのダッシュボードにアクセスします。
以下のURLを開きます。
http://localhost:7700/
ダッシュボードを開くことができました。
テーブルの作成
インデックスを登録するためのテーブルを作成します。
テーブルは任意ですが、以下のテーブルを作成しました。
$ sail artisan make:migration create_posts_table
マイグレーションファイルを修正します。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body');
$table->timestamp('published_at')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posts');
}
};
マイグレーションを実行します。
$ sail artisan migrate
モデルの作成
以下のコマンドで、作成したテーブルに対するモデルを作成します。
$ sail artisan make:model Post
モデルを修正し、Searchableを追加します。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Post extends Model
{
use HasFactory;
use Searchable;
}
Meilisearchの実装準備
Scoutのインストール
以下のコマンドで、Scoutをインストールします。
$ sail composer require laravel/scout
Scoutの設定ファイルを公開します。
$ sail php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
以下のファイルが作成されます。
config\scout.php
Meilisearchのドライバを使用するために、Meilisearch PHP SDKをComposerでインストールします。
以下のコマンドを実行します。
$ sail composer require meilisearch/meilisearch-php http-interop/http-factory-guzzle
設定の変更
.envを確認しましょう。
Meilisearchの設定が自動的に追加されていますので、一旦このままで進めます。
SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://meilisearch:7700
インデックスの作成
ダミーデータの用意
基本的にはデータベース(例えばMySQL)にデータを貯めます。
このデータをもとにインデックスを作成します。(作成し直すこともあります)
LaravelのFactoryとFakerを利用して、ダミーデータを作成します。
以下のコマンドを実行して、Factoryファイルを作成します。
$ sail php artisan make:factory PostFactory
Fakerを以下のように指定しました。
検索を試すために、英語の単語と、日本語の文章を指定するようにしました。
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Post>
*/
class PostFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
// 英語の単語
'title' => fake()->word(),
// 日本語の文章
'body' => fake()->realText($maxNbChars = 500),
];
}
}
Fakerの言語を設定します。
'faker_locale' => 'ja_JP',
以下のファイルを修正します。
ダミーデータを100件作ります。
<?php
namespace Database\Seeders;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
\App\Models\Post::factory(100)->create();
}
}
以下のコマンドを実行して、ダミーデータを作成します。
$ sail php artisan db:seed
以下のようにテーブルにデータを登録できました。
インデックスの作成
事前にモデルにSearchableを追加していたため、Meilisearchのインデックスも作成されています。
以下のURLにアクセスします。
http://localhost:7700/
postsというインデックス名で、100件登録されています。
既に存在するデータをもとに、インデックスを作成するには以下のコマンドを実行します。
$ sail php artisan scout:import "App\Models\Post"
Imported [App\Models\Post] models up to ID: 100
All [App\Models\Post] records have been imported.
インデックスを全て削除する場合は、以下のコマンドを実行します。
$ sail php artisan scout:flush "App\Models\Post"
全てのデータが削除されました。
ちなみに以下の指定をモデルに追加することによって、インデックス名を指定することができます。
/**
* モデルに関連付けられているインデックスの名前を取得
*
* @return string
*/
public function searchableAs()
{
return 'posts_index';
}
引き続き、検索処理や登録処理、APIキーについて解説します。
コメント