自分だけのクイズを作成しよう - Quipha
スポンサーリンク

【Laravel Scout】Meilisearchを使って全文検索を実装

Laravel

当サイトではアフィリエイト広告を利用しています。

本記事は2ページにわたって解説しています。

スポンサーリンク

はじめに

今回は、Laravel Scoutを使う方法をまとめました。
全文検索を実装するためのドライバが用意されています。

検索エンジンはLaravel Sailに標準で導入されている、Meilisearchを使用します。
日本語の検索に対応していますので試してみましょう。

Laravel Scoutを使用して実装を行うことにより、エンジンが違っても基本的には同じコーディングを行うことができます。

Laravel ScoutはAlgoliaにも対応しています。

それでは、全文検索を実装してみましょう。

使用するバージョンなど
  • Windows 11 or macOS Monterey (M1)
  • Laravel 8 or 9 or 10
  • Laravel Scout
  • Meilisearch

2022/10/18 WindowsとMacを使い、最新バージョンで確認しました。
2023/03/11 Laravel10で確認しました。

他にも私のブログで、Laravelについて解説している記事がありますのでご覧ください。

スポンサーリンク

【紹介】個人開発

私の個人開発ですがQuiphaというサービスを開発しました。(Laravel, Vue3など)
良かったら、会員登録して動作を試してみて下さい。

また、Laravel 9 実践入門という書籍を出版しました。
Kindle Unlimitedを契約している方であれば、読み放題で無料でご覧いただくことができます

是非多くの方に読んでいただき、Laravelの開発に少しでもお役に立てたら幸いです。

開発環境の準備

今回は、Laravel Sailを使って環境の構築を行いました。
以下の記事を参考にしてください。

Windows
Mac

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/

ダッシュボードを開くことができました。

現状、v1.0.2でした。

テーブルの作成

インデックスを登録するためのテーブルを作成します。
テーブルは任意ですが、以下のテーブルを作成しました。

$ sail artisan make:migration create_posts_table

マイグレーションファイルを修正します。

database\migrations\xx_create_posts_table.php
<?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を追加します。

app\Models\Post.php
<?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

APIキーの指定については、後述しています。

スポンサーリンク

インデックスの作成

ダミーデータの用意

基本的にはデータベース(例えばMySQL)にデータを貯めます。
このデータをもとにインデックスを作成します。(作成し直すこともあります)

LaravelのFactoryとFakerを利用して、ダミーデータを作成します。

Fakerを利用すると、氏名やメールアドレスなど、ダミーデータを簡単に作成できます。

以下のコマンドを実行して、Factoryファイルを作成します。

$ sail php artisan make:factory PostFactory

Fakerを以下のように指定しました。
検索を試すために、英語の単語と、日本語の文章を指定するようにしました。

database\factories\PostFactory.php
<?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の言語を設定します。

config\app.php
   'faker_locale' => 'ja_JP',

以下のファイルを修正します。
ダミーデータを100件作ります。

database\seeders\DatabaseSeeder.php
<?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キーについて解説します。

コメント

タイトルとURLをコピーしました